【问题标题】:How to get value of a private c++ typed field in a oc class?如何在 oc 类中获取私有 c++ 类型字段的值?
【发布时间】:2018-12-16 18:30:10
【问题描述】:
我在iOS中有objective-c类,有一个类型是c++类的字段。
我没有 c++ 类的定义。
如何获取该字段的值?
以及如何更改此 c++ 类型字段的字段值?
例如。
@interface A
B b // c++ type
@end
class B {
int c;
}
如何获取b 的值?如何更改c的值?
【问题讨论】:
标签:
c++
ios
objective-c
reflection
【解决方案1】:
使用访问器和修改器,也称为 getter/setter:
class B {
public:
int getC() { return c };
void setC(int c_) { c = c_ };
private:
int c;
}
int main()
{
B b;
B.setC(50); // c = 50
int x = B.getC() // x = 50;
return 0;
}
【解决方案2】:
编辑:我误读了您的问题。
免责声明:在撰写本文时,我无法访问 iOS 工具链来验证 Objective-C 信息,但根据我过去使用 Objective-C 和 iOS 的经验,我对这个答案很有信心。
Objective-C 运行时提供类型自省。
如果 C++ 成员是字段:
使用 this post 或类似的技术,然后隔离您感兴趣的 ivar。
如果使用上述帖子中的循环技术:
if (strcmp(name, "target_field") == 0) {
ptrdiff_t offset = ivar_getOffset(var);
CppObject* cppObject = (CppObject*)(((ptrdiff_t*)&targetObjcInst) + offset);
// Access the public members of CppObject...
}
如果 C++ 成员是属性:
如果您只是访问一个 Obj-C 属性值,我会说跟随 this answer 并收工,但因为它是一个 C++ 属性值,所以细节尚不清楚。我不确定这是否可能。
C++ 具有friendship 的概念,提供对一种类型的非公共成员从另一种类型的访问。
即
class A;
class B {
friend class A;
int C;
};
class A {
int D;
int sum(const B& b) {
return b.C + D;
}
};
这不会扩展到 Objective-C。除非我不知道某些特定的编译器扩展,否则 Obj-C 接口不能与 C++ 类型成为“朋友”,因此 Obj-C 无法访问 C++ 类型的私有组件。提供公共访问器/修改器或公开字段是您唯一的可移植选项。