如何在oc类中获取私有c ++类型字段的值?

时间:2018-12-16 18:30:10

标签: c++ ios objective-c reflection

我在iOS中有Objective-C类,有一个类型为c ++类的字段。 我没有c ++类的定义。
如何获取此字段的值?
以及如何更改此c ++类型字段的字段值?
例如。

@interface A 
    B b // c++ type
@end

class B {
    int c;
}

如何获取b的值?如何更改c的值?

2 个答案:

答案 0 :(得分:0)

具有访问者和mutator的getter / setters:

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;
}

答案 1 :(得分:0)

编辑:我误解了您的问题。

免责声明:在撰写本文时,我无权访问iOS工具链来验证Objective-C信息,但基于我过去与Objective-C和iOS的合作经验,我对该答案充满信心。

Objective-C运行时提供类型自省。

如果C ++成员是字段:
使用this post或类似方法中的技术,然后隔离您感兴趣的ivar。
如果使用上述文章中的循环技术:

processed_list = [{key: (int(value) if key.endswith(('id', 'type')) else value) 
                   for key, value in entry.items()} 
                  for entry in processed_list]

如果C ++成员是属性:
如果您只是访问Obj-C属性值,我会说遵循this answer并将其命名为day,但是由于它是C ++属性值,因此细节尚不清楚。我不确定这是否有可能。

C ++具有friendship的概念,可以从一种类型访问另一种类型的非公共成员。

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...
}

这不会扩展到Objective-C。除非我不知道某些特定的编译器扩展,否则Obj-C接口不能与C ++类型成为“朋友”,因此Obj-C无法访问C ++类型的私有组件。提供公共访问者/更改者或将该字段公开是您唯一的便携式选择。