【问题标题】:C++ calling a Class Issue in XcodeC++ 在 Xcode 中调用类问题
【发布时间】:2012-04-23 06:42:26
【问题描述】:

我在我的一个游戏中使用 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 场景中调用 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();

游戏完美编译并运行。

你能帮帮我吗,我这两天一直在拉头发,一直没搞清楚

问候 KK

【问题讨论】:

  • 您应该从发布正确的代码开始。首先你的方法被声明为callingMe,你将它定义为RunME,但是错误是关于构造函数的,所以很难弄清楚到底出了什么问题

标签: c++ objective-c ios xcode cocos2d-x


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2010-12-31
          • 1970-01-01
          • 2018-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多