1

我正在为我的一款游戏使用 Cocos2dX,而且我是 C++ 新手。我正在创建一个类 myDelegate.h #include "cocos2d.h"

 class myOFDelegate : public cocos2d::CCLayer{
public:
    ~myOFDelegate();
    myOFDelegate();
   void RunME();
};

#endif

和 myDelegate.m

include "myOFDelegate.h"

myOFDelegate::myOFDelegate(){    }

myOFDelegate::~myOFDelegate(){    }

void myOFDelegate::RunME(){
    CCLog("call me");
}

我在我的 Hello Scene 中的菜单按钮触摸上调用 RunME 方法,如下所示

myOFDelegate *ofDelegate = new myOFDelegate();
    ofDelegate->RunME();

但我收到此错误消息


> Undefined symbols for architecture i386:  
> "myOFDelegate::myOFDelegate()", referenced from:
>       HelloWorld::CallThis() in HelloWorldScene.o   "myOFDelegate::RunME()", referenced from:
>       HelloWorld::CallThis() in HelloWorldScene.o ld: symbol(s) not found for architecture i386 clang: error: linker command failed with
> exit code 1 (use -v to see invocation)

当然,当我注释掉这两行时

myOFDelegate *ofDelegate = new myOFDelegate();
        ofDelegate->RunME();

游戏编译并完美运行。

你能帮我吗,伙计,我从 2 天开始就一直在拉头发,但一直无法弄清楚

Regads KK

4

4 回答 4

0

您制作 .cpp 类而不是 .m 类,然后编写该类的实现。如果您不想制作该类的 .cpp 扩展名,则需要制作 .mm 文件,您可以在该文件上编写您的 c++ 代码。

于 2014-04-07T06:19:44.880 回答
0

您使用的是 myOFDelegate.m 还是 myOFDelegate.mm?在 Xcode 中,cpp 文件和 Objective-c 文件使用不同的扩展名。

并在您的 cpp 文件中,使用#include(不包含或#import)

于 2012-07-10T05:49:20.100 回答
0

默认情况下,您在 myDelegate.m 中列出的内容不会编译。您遇到的错误与未在项目中构建 myDelegate.m 一致。Xcode 决定了编译器应该由扩展使用哪种语言:

  • .m 是 Objective-C
  • .cpp 是 C++
  • .mm 是 Objective-C++

您为 myDelegate.m 列出的代码不是有效的 Objective-C,需要某种形式的 C++ 编译。您可以更改用于特定文件的语言/编译器或更改默认值,例如 *.m 表示 Objective-C++。但是,除非您的项目执行这两件事中的一件,否则 myDelegate.m 将不会按书面方式编译。你确定它真的被包含在构建中吗?您可以尝试#error Test插入一条线myOFDelegate::myOFDelegate()以确保确实将 myOFDelegate 构建到您的项目中。

于 2012-07-10T07:00:29.050 回答
0

如果您上面的代码片段准确地反映了您在程序中的内容,那么您就遇到了 C++ 和 Objective-C 之间的差异。与 Objective-C 不同,在 C++ 中,您必须声明类将实现的所有方法,即使您要覆盖基类实现。因此,如果您实现 void myOFDelegate::RunME(),则需要在相关的头文件中声明该方法。在您声明的地方void callingMe();,在声明的下方void RunMe();

您还没有向我们展示 callMe() 方法的实现。请注意,正如您在标题中声明的那样,您也必须实现它;你不能省略实现。

于 2012-04-23T07:00:51.567 回答