1

是否可以使用 Objective-C 包装器代理 C++ 对象,而无需在 objc 端实现 cpp 对象的所有属性和方法?我正在寻找的是更通用的东西,我确信它适用于每个对象。

MyObjCWrapper *obj = [[MyObjCWrapper alloc] initWithCppObj: myCppObj];

[MyObjCWrapper aCppObjMethod ]; //calling a method not explicitly defined in the ObjCWarapper

继承就不行了。从 C++ 类继承是不可能的 AFAIK。

一种确定的方法是使用反射,但它不一定是最快的。还有什么?代表团?我不太熟悉它,虽然我知道一般原理。

最好的方法是拥有像 JavaScript 中的“原型”机制。通过这种方式,可以简单地将 C++ 实例附加到 Objective-C 的原型上,但这可行吗?我想重载 [] 运算符以及为原型提供适当的“自我”上下文会存在问题。

那么我能做什么呢?

4

1 回答 1

0

不,这是不可能的。

重点是,Objective-C 是非常动态的,而 C++ 更像是一种静态语言。虽然您可以调用尚未定义的 Objective-C 方法,甚至在运行时拦截该调用以处理它(通常用于将调用转发到其他地方的代理对象),但有关调用内容的信息更像是带有方法名称的“字符串”(技术上不是字符串,但类似)。您无法在运行时将其解析为 C++ 方法调用,除非您已经有一个列表来进行映射。这甚至没有考虑参数。

此外,你不能希望使用宏来隐藏它,因为 Objective-C 语法并不是真正的“宏兼容”:在某种程度上你总是可以用宏调用替换函数调用来尝试添加额外的隐藏参数或类似的东西(尽管在 C++ 中这不适用于方法...),但是您不能对 Objective-C 调用执行此操作,因为它具有完全不同的语法。

编辑:“不可能,除非您编写合适的预处理器来读取 C++ 并创建合适的 Objective-C 代码”。当然,这总是可能的。但考虑到 C++ 并不是这个星球上最琐碎的语言,也需要做很多工作。

于 2012-09-10T08:37:23.637 回答