0

Objective-C の @Protocol から継承するインスタンスに似たようなことをしようとしているので、いくつかの宣言されたメソッドを持つ @Protocol と、メソッドをオーバーライドして使用できるインスタンスが必要です。

今のところ C++ を使用して、彼のような仮想メソッドを持つクラスを作成しました。

class MyClassA
{

public:
~MyClassA(){};
virtual void doSomething(argument *) = 0;

}

およびクラス(インスタンス化して使用したいもの)

class MyClassB : public MyClassA
{

public:
~MyClassB() {};
void doSomething(argument *a);

}

これら両方のクラスの実装ファイルで、次のように doSomething() を実装しました。

void doSomething(argument *a)
{
 // yep do something
}

次に、AnotherObject (CCNode のサブクラス) で MyClassB の ivar を作成したいのですが、ここで失敗しています。次のようなクラスへの単純なポインターを配置しようとしました。

MyClassB *myB; 

そしてそれを次のように使用します:

myB->doSomething;

しかし、明らかにbad_accessでクラッシュします

使用する前にオブジェクトをインスタンス化しようとしました

MyClassB *myB = new MyClassB;

また

MyClassB *myB = MyClassB::create();

しかし、何を試してもリンカーエラーが発生しました。エラーは言う:

Undefined symbols for architecture i386:
"MyClassB::doSomething(argument*)", referenced from:
AnotherObject::init() in AnotherObject.o
"vtable for MyClassB", referenced from:
AnotherObject::init() in AnotherObject.o

私は同じことを達成するために何かが欠けています

id<Protocol>object; 

C ++よりもよく知っているobjective-Cを使用

ps。init メソッドと create_func メソッドはおそらく何らかの形で関連しているため、これが C++ の質問であっても、Cocos2d を記述することにしました。

4

2 に答える 2

1

これら両方のクラスの実装ファイルで、次のように doSomething() を実装しました。

void doSomething(argument *a)
{
 // yep do something
}

したがって、同じ名前の非メンバー関数を定義しました。あなたはメンバー関数を定義したかった:

void MyClassB::doSomething(argument *a)
     ^^^^^^^^^^
于 2013-11-10T13:09:13.813 に答える