【问题标题】:Is there C++ equivalent of Objective-C Instance and Class Methods?是否存在与 Objective-C 实例和类方法等效的 C++?
【发布时间】:2014-04-30 04:47:10
【问题描述】:

我正在使用 Xcode (cocos2d-x) 学习 C++。

我认为一个常规的 c++ void 方法相当于一个 obj-c -void Instance 方法。

是否存在与 obj-c +void 类方法等效的 c++ 方法?

谢谢

【问题讨论】:

    标签: c++ objective-c function methods


    【解决方案1】:

    Objective-C 具有隐式元类,如“What is a meta-class in Objective-C?”文章中所述。然而,元类的全部力量并没有被释放出来。如著名的“Putting Metaclasses to Work”一书中所述,它将需要多重继承支持和其他技术决策。这对 Objective-C 的作者来说可能太复杂了,所以他们决定在 Objective-C 中隐藏元类。

    Objective-C 以 Objective-C 运行时(obj.dll 或 libobjc.dylib)为目标,并且有 C++ 编译器(DTS C++、Direct-to-SOM C++)以相同的方式以 SOM 为目标。这使得 DTS C++ 在其设计中比 C++ 更接近于 Objective-C。我设法通过这种方式让旧的 Windows DTS C++ 编译器在 Windows 8 上运行:

    1. 从 IBM FTP 下载 VAC 3.5 fixpak 9。此修订包包含许多文件,因此您甚至不需要完整的编译器(我有 3.5.7 发行版,但修订包 9 足够大,可以进行一些测试)。
    2. 解压到 e。 G。 C:\home\OCTAGRAM\DTS
    3. 启动命令行并在那里运行后续命令
    4. 运行:set SOMBASE=C:\home\OCTAGRAM\DTS\ibmcppw
    5. 运行:C:\home\OCTAGRAM\DTS\ibmcppw\bin\SOMENV.BAT
    6. 运行:cd C:\home\OCTAGRAM\DTS\ibmcppw\samples\compiler\dts
    7. 运行:nmake clean
    8. 运行:nmake
    9. hhmain.exe和它的dll在不同的目录,所以我们必须让它们以某种方式找到对方;因为我做了几个实验,所以我执行了一次“set PATH=%PATH%;C:\home\OCTAGRAM\DTS\ibmcppw\samples\compiler\dts\xhmain\dtsdll”,但是你可以将 dll 复制到 hhmain 附近。 exe
    10. 运行:hhmain.exe

    我有这样的输出:

    Local anInfo->x = 5
    Local anInfo->_get_x() = 5
    Local anInfo->y = A
    Local anInfo->_get_y() = B
    {An instance of class info at address 0092E318
    
    }
    

    这个例子没有使用元类,它只是为了检查 DTS C++ 编译器。

    SOM 中的元类是显式的,因此所谓的“类方法”只不过是元类的“实例方法”。每个对象都属于某个类,由运行时创建的所谓类对象管理。类对象本身是另一个类的实例,称为元类。类的开发者可以通过 IDL 或 DTS C++ pragma 指定元类约束。

    如果需要在编译时调用已知类的方法,只需引用类对象并调用其方法,就像类对象本质上是普通对象一样。类对象通过 DLL 导入/导出机制被引用,类似于 Objective-C。

    如果需要调用对象所属类的方法,则需要调用 somGetClass() 来获取类对象,将其类型转换为元类类型并调用所需的方法。在 DTS C++ 中,可能不需要进行冗余类型转换,但我不是 IBM DTS C++ 属性方面的专家。

    【讨论】:

      【解决方案2】:

      例如。

      class A{
      public:
      static void doIt();
      };
      

      然后你可以调用函数doIt:

      void main()
      {
      A::doIt();
      }
      

      【讨论】:

      • 你错过了static关键字
      【解决方案3】:

      C++ 中没有直接等价于类的方法;但是,在许多情况下,可以使用 C++ 静态方法代替类方法。

      例如,这段 Objective-C 代码:

      @interface MyClass : NSObject
      {
          int _number;
      }
      + (MyClass*)newInstance;
      - (void)instanceMethod;
      @end
      
      @implementation MyClass
      + (MyClass*)newInstance 
      {
          return [[self alloc] init]; 
      }
      
      - (void)instanceMethod 
      { 
          _number = 123;
          std::cout << _number;
      }
      @end
      
      int main(void)
      {
          MyClass* foo = [MyClass newInstance];
          [foo instanceMethod];
          return 0;
      }
      

      大致相当于这段 C++ 代码:

      class MyClass
      {
          int _number;
      
      public:
          static MyClass* newInstance();
          void instanceMethod();
      };
      
      MyClass* MyClass::newInstance() 
      { 
          return new MyClass(); 
      }
      
      void MyClass::instanceMethod() 
      { 
          _number = 123; 
          std::cout << _number;
      }
      
      int main(void)
      {
          MyClass* foo = MyClass::newInstance();
          foo->instanceMethod();
          return 0;
      }
      

      该示例还说明了类方法和静态方法之间的区别之一。

      +newInstance 将被子类继承,并且总是能正常工作(它总是会返回一个子类的实例)。它也可以被子类覆盖。

      MyClass::newInstance() 这样的静态方法不能被继承或覆盖。它总是会返回一个MyClass 的实例。

      因此,当您在 Objective-C 和 C++ 之间移植代码时,有时您无法使用静态方法代替类方法。但在大多数情况下,C++ 静态方法是一个很好的替代品。

      【讨论】:

        【解决方案4】:

        C++ 中类方法的等价物是static 函数。

        static return_type function_name(parameters);
        

        就像在 Objective-C 中一样,在静态函数中不能引用实例变量(因为没有实例),只能引用 static 变量。

        【讨论】:

        • 静态类方法和静态函数不同。前一个是这个问题的答案,后一个(主要)用于私人功能
        【解决方案5】:
        class SomeClass {
        public:
        
            static void someMethod();
        
        };
        

        【讨论】:

          猜你喜欢
          • 2016-06-17
          • 2019-03-07
          • 1970-01-01
          • 2010-12-11
          • 1970-01-01
          • 1970-01-01
          • 2019-03-23
          • 1970-01-01
          • 2012-04-01
          相关资源
          最近更新 更多