我正在使用Xcode(cocos2d-x)学习C ++。
我认为常规的c ++ void方法等同于obj-c -void Instance方法。
是否存在obj-c + void Class方法的c ++等价物?
由于
答案 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();
};
然后你可以用:
调用函数doItvoid 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 ++编译器:
我有这样的输出:
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 ++属性的专家。