0

我正在尝试做一些与Objective-C中的@Protocol hinerit 的实例类似的事情,所以我想要一个带有一些声明方法的@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
}

然后在另一个对象(它是 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

附言。我决定编写 Cocos2d,即使这是一个 C++ 问题,因为 init 和 create_func 方法可能在某种程度上相关

4

2 回答 2

2

实施MyClassB::doSomething()。你声明了它,你使用了它,因此你必须实现它。

您必须在实现文件中实现 doSomething() ,例如

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

不喜欢void doSomething(argument *a)

于 2013-11-10T12:45:53.343 回答
1

在这两个类的实现文件中,我已经像这样实现了 doSomething() :

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

所以你已经定义了一个同名的非成员函数。您想定义成员函数:

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