是否有C ++等效的Objective-C实例和类方法?

时间:2014-03-22 19:01:51

标签: c++ objective-c function methods

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

我认为常规的c ++ void方法等同于obj-c -void Instance方法。

是否存在obj-c + void Class方法的c ++等价物?

由于

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

class SomeClass {
public:

    static void someMethod();

};

答案 2 :(得分:1)

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

static return_type function_name(parameters);

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

答案 3 :(得分:0)

例如。

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

然后你可以用:

调用函数doIt
void main()
{
A::doIt();
}

答案 4 :(得分:0)

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),并且以相同的方式存在以SOM为目标的C ++编译器(DTS C ++,Direct-to-SOM C ++)。这使得DTS C ++在设计上比C ++更接近Objective-C。我设法在Windows 8上运行旧的Windows DTS C ++编译器:

  1. 从IBM FTP下载VAC 3.5 fixpak 9。这个fixpak包含很多文件,所以你甚至不需要完整的编译器(我有3.5.7发行版,但是fixpak 9足以做一些测试)。
  2. 打开电子邮件。 G。 C:\家\八角星\ 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位于不同的目录中,因此我们必须让它们以某种方式找到对方;因为我做了几次实验,所以我执行了一次“设置PATH =%PATH%; C:\ home \ OCTAGRAM \ DTS \ ibmcppw \ samples \ compiler \ dts \ xhmain \ dtsdll”,但你可以将dll复制到hhmain附近。 exe文件
  10. 运行:hhmain.exe
  11. 我有这样的输出:

    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中的元类是显式的,因此所谓的“类方法”只不过是元类的“实例方法”。每个对象都属于某个类,由运行时创建的所谓类对象管理。类对象本身是另一个类的实例,名为metaclass。类的开发人员可以通过IDL或DTS C ++ pragma指定元类约束。

    如果需要在编译时类调用已知方法,那么就可以像引用类对象一样引用类对象并调用其方法。通过DLL导入/导出机制引用类对象,类似于Objective-C。

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