【问题标题】: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++ 类型的私有组件。提供公共访问器/修改器或公开字段是您唯一的可移植选项。

      【讨论】:

      • 我没有源代码,所以需要使用反射。
      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多