ibr*_*ter 6 c++ objective-c objective-c++
简短版本:我有一个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类的头文件,我就会从苹果头文件(NSValue.h)中获得几百个关于"'''令牌之前的非预期不合格ID"的错误. ,NSObject.h等)显然这不起作用,至少不是原样.在我的类头文件中包含任何cocoa头时,我得到相同的结果.
然后我想我会尝试使用objective-c类的前向声明(这就是我让其他Objective-c对象工作的方式).但是,这也没有用 - 如果我将其声明为"class myClassName",我会收到一个关于将类重新定义为不同类型符号的错误(可能是c ++类vs objective-c协议).如果我尝试将其声明为@protocol myClassName,我会收到关于"'''令牌之前的预期unqualified-id"的错误.那我怎么能做这个呢?
cli*_*hlt 11
好的回答你的问题:
reportwindow.h还包含在.cpp文件中,如果这有所不同.
它的确有所作为.触摸Objective-C代码的任何编译单元(在本例中为cpp文件)都必须重命名为.mm或.m.包括反过来包含C++文件中的Objective-C内容的标题将导致C++编译器看到无法处理的Objective-C代码的问题.
将cpp文件重命名为mm将在编译期间选择Objective-C选项(这不是文件命名为cpp或c时),因此允许使用Objective-C标记编译内容(在您的情况下主要是"@") .
另一种方法是不将Objective-C委托类包含在C++类中,而是在Objective-C委托中包含指向C++类的指针(即以相反的方式实现它).这样你就可以安排Objective-C代码没有触及C++代码的东西.
编辑:其实,我更喜欢第二个建议.这是一个例子:
DelegateClass.h:
class MyCPPClassHandlingStuff;
@interface MyDelegateObject : NSObject <SomeDelegateProtocol> {
MyCPPClassHandlingStuff *m_handlerInstance;
}
- (id) initWithCPPInstance:(MyCPPClassHandlingStuff*)cppInstance;
- (void) theDelegateProtocolMethod;
@end
Run Code Online (Sandbox Code Playgroud)
DelegateClass.mm
#include "MyCPPClassHandlingStuff.h"
@implementation MyDelegateObject
- (id) initWithCPPInstance:(MyCPPClassHandlingStuff*)cppInstance
{
self = [super init];
if (self) {
m_handlerInstance = cppInstance;
}
return self;
}
- (void) theDelegateProtocolMethod
{
if (m_handlerInstance)
m_handlerInstance->handleDelegateMethod();
}
@end
Run Code Online (Sandbox Code Playgroud)
以及MyCPPClassHandlingStuff.h:
#ifndef __MyCPPClassHandlingStuff_H__
#define __MyCPPClassHandlingStuff_H__
class MyCPPClassHandlingStuff
{
public:
MyCPPClassHandlingStuff();
void handleDelegateMethod();
};
#endif /* __MyCPPClassHandlingStuff_H__ */
Run Code Online (Sandbox Code Playgroud)
MyCPPClassHandlingStuff可以从Objective-C的初始化,但你不能从初始化C++代码有任何Objective-C类.如果需要在C++代码中使用Objective-C,则必须将其编译为Objective-C(即使用.mm文件).我将.cpp细节作为练习留给读者;)
| 归档时间: |
|
| 查看次数: |
7980 次 |
| 最近记录: |