【发布时间】: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
我正在使用 Xcode (cocos2d-x) 学习 C++。
我认为一个常规的 c++ void 方法相当于一个 obj-c -void Instance 方法。
是否存在与 obj-c +void 类方法等效的 c++ 方法?
谢谢
【问题讨论】:
标签: c++ objective-c function methods
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 上运行:
我有这样的输出:
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++ 属性方面的专家。
【讨论】:
例如。
class A{
public:
static void doIt();
};
然后你可以调用函数doIt:
void main()
{
A::doIt();
}
【讨论】:
static关键字
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++ 静态方法是一个很好的替代品。
【讨论】:
C++ 中类方法的等价物是static 函数。
static return_type function_name(parameters);
就像在 Objective-C 中一样,在静态函数中不能引用实例变量(因为没有实例),只能引用 static 变量。
【讨论】:
class SomeClass {
public:
static void someMethod();
};
【讨论】: