我可以使用C ++类实例作为Objective-C ++ id吗?

时间:2013-11-18 19:36:06

标签: c++ cocoa objective-c++ nstablecolumn

在将我的C ++数据模型连接到我的Cocoa表列UI时,我想知道是否可以在id(标识符)处向initWithIdentifier提供C ++类实例

// what magic needs to occur to create an id from a CPP class?
id someIDMadeFromAClassInstance = a_ptr_to_a_cpp_class_instance;

NSTableColumn *col = [[NSTableColumn alloc] initWithIdentifier:someIDMadeFromAClassInstance"];

这一点的重点在于,当调用NSTable的数据源方法objectValueForTableColumn时,我可以检索id并以某种方式转换为返回有效的C ++类实例:

id columnIdentifer = [aTableColumn identifier];

MyCPPClass* pAValidClass = [someMagicOnTheID columnIdentifer];

pAValidClass->AClassMethod();

我猜这是一种更传统的方法,但我希望简化Cocoa UI和纯C ++模型之间的连接。

1 个答案:

答案 0 :(得分:4)

C ++对象指针不能存储在id类型变量中。在Objective-C中,id是指向未知类型的Objective-C对象的指针。由于C ++对象不是Objective-C对象,因此将指针存储到id中的C ++对象是不安全的。

解决方案是向Objective-C类添加一个属性,该类将存储C ++对象指针。如果必须使用id,则可以创建一个包含存储C ++对象指针的属性的Objective-C类,例如:

@interface MyCPPClassWrapper : NSObject

@property (nonatomic, assign) MyCPPClass *myCPPClass;

@end

// ...

MyCPPClassWrapper *wrapper = [[MyCPPClassWrapper alloc] initWithMyCPPClass:myCPPClass];

// Hand wrapper off to your NSTable

同时查看NSValue。它为C风格的指针提供了存储机制。对于NSValue,您可以执行以下操作:

NSValue *someIDMadeFromAClassInstance = [NSValue valueWithPointer:a_ptr_to_a_cpp_class_instance];

NSTableColumn *col = [[NSTableColumn alloc] initWithIdentifier:someIDMadeFromAClassInstance"];

// ...

NSValue *columnIdentifer = (NSValue *)[aTableColumn identifier];
MyCPPClass* pAValidClass = (MyCPPClass *)[columnIdentifer pointerValue];
pAValidClass->AClassMethod();