• ベストアンサー

抽象クラスのエラーが出ます

http://www5f.biglobe.ne.jp/~kenmo/program/skinmesh/skinmesh.html このサイトのコードを動かそうとすると、 >error C2259: 'CAllocateHierarchy' : 抽象クラスをインスタンス化できません。 というエラーが出てしまいます。 抽象クラスというのを初めて聞いたのですが、 どうすればこのエラーを消せるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

 こんにちは。  継承元のIUnknownインターフェースが実装されていないのでは。  http://msdn.microsoft.com/ja-jp/library/cc372741.aspx  QueryInterface()ですが、ID3DXAllocateHierarchyに対応するGUIDは無い様ですので(恐らくコンポーネントとして公開する場合に自身でGUIDを登録する)、普通にthisポインタを返せば良いと思います。 STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppReturn) { //REFIID(GUID)があれば //if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, /*ID3DXAllocateHierarchyに対応するインターフェースID*/) //{ // *ppReturn = this; // this->AddRef(); // return S_OK; //} //*ppReturn = NULL; //return E_NOINTERFACE; //REFIID(GUID)が無ければ *ppReturn = this; this->AddRef(); return S_OK; } STDMETHODIMP_(DWORD) AddRef() { return ++m_nRefCount; } STDMETHODIMP_(DWORD) Release() { if(--m_nRefCount) return m_nRefCount; delete this; return 0; }

zaxs5968
質問者

お礼

ご回答ありがとうございました。 IUnknownインターフェース、 QueryInterface()、 GUID、REFID、 ちょっと今の自分には早すぎた様で、1個1個を調べてるものの 全体像が全く掴めない状況に; 理解できるまでじりじり学習してみようと思います; ありがとうございました

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.1

オーバーライドを前提に作られている純粋仮想メソッドが実装されていないと言うことです。 ID3DXAllocateHierarchyにvirtual宣言されている未実装のメソッドがあって、そのメソッドの実装をCAllocateHierarchy内で行う必要があるのだと思います。 http://www.geocities.jp/ky_webid/cpp/language/010.html

zaxs5968
質問者

お礼

ご回答ありがとうございます。 どうやらクラスに対する理解が相当なってない事を自覚しました。 最低限扱っているだけだったようで; 参考サイトの紹介等、ありがとうございましたっ

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 抽象メソッド、抽象クラス

    C#を勉強しております。Javaにも同じ機能がありC#のカテゴリーがない為こちらで質問させていただきます。抽象メソッドや抽象クラスを使う利点に関してです。 これらを使う利点を調べたところオーバーライドさせられると書いてありました。オーバーライドしないと 実装がないのでエラーになると書いてありました。その点は理解できたのですが何故基本クラスで実体のない定義をする利点がよくわかりません。それなら最初から派生クラスの方にメソッドを定義すればいいのではという考えになりました。 抽象メソッドとして実体のない定義を行う利点なるものを教えてください。 よろしくお願いします。

  • 抽象クラスが継承されているかどうか検証したい

    Class.forName()にて取得したクラスが、特定の抽象クラスを継承しているかどうかを 検証したいです。 Class.getInterfaces()にて、実装されているインターフェースを取得することが出来ましたが、 Class.getClasses()、Class.getDeclareClasses()のいずれでも、継承されている 抽象クラスを取得することが出来ません。 そもそも抽象クラスはインスタンス化できないからなのかもしれませんが、 ならば、その抽象クラス名称を取得したいです。 方法はありますでしょうか? 無理ならばインターフェースの実装にし、基盤部で動作のカバーを する作りで考え直すつもりです。

    • ベストアンサー
    • Java
  • 抽象クラスのインスタンスフィールドの初期化について

    早速ではございますが質問をさせていただきます。 抽象クラスのインスタンスフィールドは、いつ初期化が 行われるのでしょうか?どうかご教授のほどよろしくお願 いします。

    • ベストアンサー
    • Java
  • インターフェイス 抽象クラス

    PHP初心者です。 xampp1.7.0(最新)でアパッチなど一括ダウンロード クラスの概念は分かりましたが、インターフェイス、及び抽象クラスについて理解が追い付きません。 下記コードをご覧ください。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <? abstract class AbstractClass { abstract public function test1(); } class Impl1 extends AbstractClass { public function test1() { print "こんにちは\n"; } } class Impl2 extends AbstractClass { public function test1() { print "ありがとう.\n"; } public function hoge() { print "さようなら\n"; } } $i1 = new Impl1(); $i1->test1(); $i2 = new Impl2(); $i2->test1(); ?> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 抽象クラスが上にありますが、中身がないので継承し、そのクラスの中で処理させています。抽象クラスの必然性が理解できません。まあこのコード事態がものすごく短いので、その必然性がないと思うのですが、例えばもっと長いコードになったときなどは抽象クラスは絶対使った方がいいということになるのでしょうか。 さらに全て抽象クラスであればインターフェイスを利用できるようですが、インターフェイスのメリットにつき理解が追い付きません。 どなたかご教授お願いいたします。

    • ベストアンサー
    • PHP
  • インターフェイスと抽象クラス

    なかなか理解が難しくて苦しんでいます。 で自分なりに理解したのですが、 抽象クラス→内容に決まっているメソッドと決まっていないメソッドがある場合に決まっていないメソッドを あとからオーバーライドするだけでスーパークラスで定義したすべてのメソッドを利用できる。 これでただしいでしょうか? で、インターフェイスなのですが、この抽象クラスとそっくりなんですが、 (1)変数は定数になる(強制static)(2)メソッドは名前のみの宣言(内容は記述できない) と言うことで、かなり???なのです。 何のために・・・???記述するんでしょうか?? ただひとつメリットがあるとしたら、インターフェイスを実装すると、インターフェイスの配列でインスタンスを 生成出来るということぐらいでしょうか。 そこでちょっとお門違いの疑問かもしれないんですが、 Runnable、やMouselistenerはメソッドの内容が書かれていないのに、 なぜ機能を持たせることが出来るのでしょう??? 認識違い、間違い等ありましたら、教えてください よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 抽象クラスの継承について

    すいませんがご教授下さい。 ASP.NETとVB.NETを使用してアプリを開発しています。 存在するクラスは以下のようなクラスです。 (WebForm1.aspxとWebForm1.aspx.vbとClass1.vb(抽象クラス)があります。) したい事はClass1.vbをWebForm1.aspx.vbが継承したいのですが継承させた後にWebForm1.aspxを開こうとすると「Webフォームデザイナにファイルを読み込めませんでした。・・・・」とエラーポップアップが表示されます。「はい」でHTMLは見れるのですがデザインはタブ自体がないです。普通のクラスを継承させると問題ないのですが。抽象クラスだとエラーになります。 対処方を教えて下さい。

  • javaのクラスの作り方、エラーの原因が不明です

     今晩は、javaの初心者です。宜しく願いします。  下のようなコードを書いたら、「アクセス可能な型 C1 のエンクロージング・インスタンスが ありません。  型 C1 のエンクロージング・インスタンスで割り振りを限定する必要があります (たとえば x.new A() で、x は C1 のインスタンス)。」 とエラーが出ました。  eclipseでは、「C2 c_2 = new C2() ;」の箇所で赤いエラーマークが表示されています。  C1クラスとC2クラスを分けてやると正常に実行されます。  C1クラスの中にC2クラスを作ると文法的にどこがまずいのでしょうか。  あるクラスの中に別のクラスを書いているプログラムを見たような気もするのですが。  C1クラスとC2クラスをわかるのとはJAVA的に何がいけないのでしょうか。  原因がさっぱり分りません、宜しくお願いいたします。 ======================================================================= public class C1 { int a = 9 ; int b = 8 ; int c = 7 ; int d = 6 ; // C2 c_2 ; public void Calc1() { System.out.println("a+b= " + (a+b)) ; } public static void main(String[] args) { C2 c_2 = new C2() ; c_2.Calc2() ; C1 c_1 = new C1() ; c_1.Calc1(); // c_1.Calc2(); } class C2 { // int c = 7 ; // int d = 6 ; public void Calc2() { System.out.println("c-d= " + (c-d)) ; } } } =========================================================================

  • 抽象クラスからオーバーライドについて

    EclipseでJavaを勉強始めました。 抽象クラスからオーバーライドするところで質問致します。 抽象クラスとして、「面積を計算する」というメソッドをもつDiagramクラスを定義しました。それを継承して、「四角形の面積を計算する」というメソッドをもつSquareクラスと、「三角形の面積を計算する」というメソッドをもつTriangleクラスを定義しました。 Squareクラス、Triangleクラスからインスタンスを生成して、四角形、三角形の面積をコンソールに表示させるという簡単なプログラムです。 このとき、main関数と3つのクラスの関係についてお尋ねします。 (1)iagram.java、Square.java、Triangle.javaそれぞれにクラス定義とmain関数を持たせるパターン public abstract class Diagram { // 面積計算定義(抽象メソッド) public static void main(String[] args) { } } public class Square extends Diagram{ //四角形の面積の計算定義 public static void main(String[] args) { //四角形の面積の計算と表示 } public class Triangle extends Diagram{ //三角形の面積の計算定義 public static void main(String[] args) { //三角形の面積の計算と表示 } (2)sample.javaというファイルにまとめ、その中にこの3つのクラス定義とmain関数を一つ持たせるパターン public class sample { public static void main(String[] args) { //四角形の面積の計算と表示 //三角形の面積の計算と表示 } } abstract class Diagram { // 面積計算(抽象メソッド)定義 } class Square extends Diagram{ //四角形の面積の計算定義 } class Trapezoid extends Diagram{ //三角形の面積の計算定義 } この二通りを考えて、どちらも実行できたのですが、どちらの方がJavaらしいプログラムと思われますでしょうか?

    • ベストアンサー
    • Java
  • 内部クラス?のエラー

    内部クラス?のエラー  今晩は、JAVA初心者です、宜しくお願い致します。  下のようなプログラムを書いてやりました。  <A>のように全体のプログラムを1つのクラスの中に別のクラスを入れる(内部クラス?)と、 「アクセス可能な型Testのエンクロージング・インスタンスがありません。  型Testのエンクロージング・インスタンスで割り振りを限定する必要があります。  (例えばx.new A()でxはテストのインスタンス)」というエラーがでます。  しかし、<B>のように別のクラスにすると、エラーは出ません。  この原因がよくわかりません。 ==================================================================== <A> public class Test { public static void main(String args[]) { Calc ca = new Calc(); ca.calcTest(1,2); } class Calc { void calcTest(int a , int b ) { int c = a + b ; System.out.print("a + b = " + c); } } } ==================================================================== <B> public class Test { public static void main(String args[]) { Calc ca = new Calc(); ca.calcTest(1,2); } } class Calc { void calcTest(int a , int b ) { int c = a + b ; System.out.print("a + b = " + c); } } ====================================================================

    • ベストアンサー
    • Java
  • 抽象クラスを継承した普通のクラスから、

    抽象クラスを継承した普通のクラスから、 抽象クラス内でprotected宣言したクラスのフィールド(連想配列)へ データをセット&ゲットしてみたいのですが、やり方がよく分かりません。 上記内容を満たす簡単なサンプルを誰か作っていただけないでしょうか。 ちなみに、下記は、自分でやろうとして、頭がこんがらがってしまった例です。 あくまでもイメージですが、 こんな感じで、作成していただけると、うれしいです。 <?php abstract class A1{ protected $data = array();   public function setData($value){ $this->data[$key] = $value; } public function getData($key = null){ if (null == $key) { $this->data; } else { $this->data[$key]; } } } class C1 extends A1{ public function main(){ $this->setData('key1') = 'value1'; $this->setData("キー2") = "値2"; } } $c1 = new C1; $c1 -> main(); var_dump($data); ?>

    • ベストアンサー
    • PHP