【发布时间】:2015-11-06 05:32:19
【问题描述】:
短版:我有一个 Qt/C++,我必须添加有限数量的 Cocoa/Objective-C 代码。我已将 .cpp 文件更改为 .mm 文件,并将 Objective-c 代码/对象添加到所述文件中,它可以编译并工作。我现在需要一个代表我创建的一个对象——确切地说是一个 NSPopUpButton(或者,更确切地说,它的菜单)——我被困住了。如何为该对象添加委托?
详情: 有问题的文件:
reportwindow.h、reportwindow.cpp 重命名为 reportwindow.mm - 这些是包含我的原始 C++ 实现以及一些 Objective-C 代码的文件(打开一个包含 NSPopUpButton 的 NSSavePanel)。如果有区别的话,reportwindow.h 会另外包含在 .cpp 文件中。
menuHandler.h、menuHandler.mm - 这些文件包含一个(当前为空的)objective-c 类,我打算将其用作委托
我的第一个想法是我可以简单地将 C++ 类设为委托,但这显然行不通,因为直接的 C++ 不理解委托。然后我想我会创建一个单独的objective-c类作为NSMenuDelegate,并将它的一个实例作为成员对象添加到我的C++类中。由于我已经能够添加其他objective-c 对象作为成员,我认为这应该可以工作。但是,一旦我在 C++ 类头文件中包含了我的新 Objective-c 类的头文件,我就收到了数百个关于“在'@'令牌之前的预期不合格 ID”的错误 - 来自苹果头文件(NSValue.h , NSObject.h 等)所以显然这不起作用,至少不是原样。在我的类头文件中包含任何可可头文件时,我得到相同的结果。
然后我想我会尝试对objective-c 类进行前向声明(这就是我让其他objective-c 对象工作的方式)。然而,这也不起作用——如果我将它声明为“class myClassName”,我会收到一个关于将类重新定义为不同类型的符号的错误(大概是 c++ 类与 Objective-c 协议)。如果我尝试将其转发声明为@protocol myClassName,则会收到有关“'@' 令牌之前的预期不合格 ID”的错误。那么我怎样才能完成这项工作呢?
【问题讨论】:
-
您是否将那个特定的 cpp 文件重命名为 mm?
-
与有问题的标题相关联的那个,是的。
-
第二种方法是要走的路,而且可能是唯一的方法。你不应该在第一次失败的尝试后投降。提供更多详细信息,包括什么,可能还有更多的 .cpp 文件,其中包括
reportwindow.h。 -
好吧,在第一次尝试失败后,我并没有完全投降——我只是没有包括我斗争的所有血腥细节 :-)
标签: c++ objective-c objective-c++