如何绑定c++;对象作为objective-c中的属性? 我想绑定到ObjtoE-C对象属性,但是属性是C++类。该属性实际上是一个数学向量类,更易于使用,因为运算符重载对于向量数学非常有用。 (我甚至看不到一个处理objective-C对象的向量数学的好方法,是吗?)

如何绑定c++;对象作为objective-c中的属性? 我想绑定到ObjtoE-C对象属性,但是属性是C++类。该属性实际上是一个数学向量类,更易于使用,因为运算符重载对于向量数学非常有用。 (我甚至看不到一个处理objective-C对象的向量数学的好方法,是吗?),c++,objective-c,cocoa-bindings,objective-c++,C++,Objective C,Cocoa Bindings,Objective C++,问题是绑定此向量属性会使应用程序崩溃。 以下是一个例子: @interface M_Node : NSObject{ Vec3f pos; M_Node *manipulator } @property Vec3f pos; @end @implementation @synthesize pos; @dynamic pos; -(void)setPos:(Vec3f)newPos{ pos=Vec3f(newPos); } -(Vec3f)pos{ return Vec3f(pos); }

问题是绑定此向量属性会使应用程序崩溃。 以下是一个例子:

@interface M_Node : NSObject{
Vec3f pos;
M_Node *manipulator
}
@property Vec3f pos;
@end

@implementation
@synthesize pos;

@dynamic pos;
-(void)setPos:(Vec3f)newPos{
pos=Vec3f(newPos);
}
-(Vec3f)pos{
return Vec3f(pos);
}

- (id) init
{
self = [super init];
if (self != nil) {
[self bind:@"pos" toObject:self withKeyPath:@"manipulator.pos" options:nil];
}

return self;
}
Xcode发布: “Vec3f”(又名“Vec3”)类型的原子属性使用非平凡赋值运算符合成setter

我使用cinder的Vec3f等级:

问题是,如何将C++对象绑定为Objtovi-C中的属性,或者甚至可能?还有别的路要走吗? (如果您对如何使用objective-c进行干净向量、矩阵等数学运算有任何想法,请告知我。)

这是我在文档中发现的:

标量值和结构值的KVC转换 KVC方法valueForKey:和setValue:forKey:的默认实现支持标量数据类型(如BOOL、char、double、float、int)和结构(如NSPoint、NSRange和NSRect)的自动对象包装。Cocoa脚本调用valueForKey:获取值时,KVC会根据需要自动将该值转换为NSNumber对象(对于标量)或NSValue对象(对于结构)。 类似地,setValue:forKey:确定指定键的相应访问器或实例变量所需的数据类型。如果数据类型不是对象,则使用适当的NSValue方法从传递的对象中提取值。 有关更多信息,包括受支持类型的表,请参阅《键值编码编程指南》中的标量和结构支持

尽管如此,仍然存在用于NSRect等结构的包装器。可能有一种方法可以覆盖原始值forkey:因此它也可以处理Vec3f


<> P>这将是一个新的问题:<强>如何重写ValueFoKiK::StValue:FordKi:这样它就能够处理我自己的C++对象?< /强>

< P>我非常怀疑这会起作用。< 绑定是基于键值编码(KVC)和键值观察(KVO)构建的。您正在使用
操纵器.pos的关键路径。这意味着
操纵器
属性必须是Objective-C对象,对于
pos
属性,该对象必须与KVC和KVO兼容。目前还不清楚,但我怀疑 MyNobs/CODE >是C++类,而不是Objy-C类,因此对于任何事情都不符合KVC或KVO。 接下来的问题是KVC如何返回并传递
pos
的值(如果它能够到达)。KVC将非对象数据类型包装在
NSNumber
NSValue
中以传递它们。然而,如果一个
Vec3f
是非POD的,那么我怀疑它是否能正常工作


归根结底,绑定并不是神奇的(尽管不可否认,KVO在其实现中有一些近乎神奇的东西)。问题是,您是否希望
[[yourObject valueForKey:@“manipulator”]valueForKey:@“pos”]
能够正常工作?您希望
[[yourObject valueForKey:@“操纵器”]setValue:someValue forKey:@“pos”]
工作吗?如果没有,那么绑定就不可能工作。

在初始值设定项中,您是否尝试将[self-bind:etc…放入If(self!=nil)中块?块外的任何东西都意味着self可能为nil,编译器将启动。实际上,这是一个键入错误。原始对象在if块内。我甚至尝试从外部绑定两个完全独立的对象。它仍然崩溃。您是否尝试过自己实现setter?这是我现在正在研究的,但仍然是崩溃。我更新了问题,包括getter和setter。我已经找到了一种可能有效的方法。(实际上stackoverflow还不允许我回答我的问题,所以我会在顶部更新它。我提到了你的想法,但是,为了让它工作,必须使用
Vec3f
)。“不清楚,但我怀疑MyNoad是C++类,不是ObjuleC类”,No.<代码> MyNobs/COD>显然是Obj-C类。请参阅OP代码示例的第一行:<代码> @接口MyNodo:NSbObjs> <代码>