c++中是否有类似于Objective-C的实例和类方法?

Is there C++ equivalent of Objective-C Instance and Class Methods?

本文关键字:实例 类方法 Objective-C 是否 类似于 c++      更新时间:2023-10-16

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

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

是否有一个c++等效的obj- c++ void类方法?

谢谢

在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++静态方法是一个很好的替代品。

class SomeClass {
public:
    static void someMethod();
};

c++中的类方法等价于static函数。

static return_type function_name(parameters);

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

例如:

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

你可以调用函数doIt:

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

Objective-C有隐式元类,详见"Objective-C中的元类是什么?"一文。然而,元类的全部功能并没有被释放出来。它将需要多重继承支持和其他技术决策,正如著名的"让元类工作"一书中所描述的那样。这对于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修复包9。这个修复包包含许多文件,所以你甚至不需要完整的编译器(我有3.5.7发行版,但是修复包9足够大,可以做一些测试)。
  2. 解压到例如C:home octagagram DTS
  3. 启动命令行并运行后续命令
  4. 运行:set SOMBASE=C:home octagagram DTSibmcppw
  5. 运行:C: OCTAGRAM DTS ibmcppw bin SOMENV.BAT
  6. 运行:cd C:home octagagram DTSibmcppwsamplescompiler DTS
  7. 运行:nmake clean
  8. :运行nmake
  9. hhmain.exe和它的dll在不同的目录下,所以我们必须让它们以某种方式找到对方;因为我做了几个实验,我执行了"set PATH=%PATH%;C:homeOCTAGRAMDTSibmcppwsamplescompiler DTS xhmaindtsdll"一次,但你可以只复制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指定元类约束。

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

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