c++中是否有类似于Objective-C的实例和类方法?
Is there C++ equivalent of Objective-C Instance and Class Methods?
我正在用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上运行:
- 从IBM FTP下载VAC 3.5修复包9。这个修复包包含许多文件,所以你甚至不需要完整的编译器(我有3.5.7发行版,但是修复包9足够大,可以做一些测试)。
- 解压到例如C:home octagagram DTS
- 启动命令行并运行后续命令
- 运行:set SOMBASE=C:home octagagram DTSibmcppw
- 运行:C: OCTAGRAM DTS ibmcppw bin SOMENV.BAT
- 运行:cd C:home octagagram DTSibmcppwsamplescompiler DTS
- 运行:nmake clean
- :运行nmake
- hhmain.exe和它的dll在不同的目录下,所以我们必须让它们以某种方式找到对方;因为我做了几个实验,我执行了"set PATH=%PATH%;C:homeOCTAGRAMDTSibmcppwsamplescompiler DTS xhmaindtsdll"一次,但你可以只复制dll附近的hhmain.exe
- 运行: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++属性方面的专家。
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 从基类实例调用派生类方法而不进行强制转换
- 模板中的模板方法 - 实例声明和类方法声明签名不同
- 实例成员与静态成员与非类方法的开销
- 让类方法为每个实例保存不同的静态变量
- 如何在 C 中包装C++具有参数的类方法或返回另一个C++类的实例?
- 使用类方法而不实例化
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- 从C++中的父类实例访问子类方法
- 如何为类的每个实例创建特定实例的方法
- 将类实例和方法作为参数传递给C 中的另一个函数
- C++采用同一类实例的类方法
- 在类实例或方法的上下文中调用函数以进行性能分析
- 模板类方法的部分专用化或实例化
- 用于命名模板静态类方法的特定实例的语法
- 如何在尝试为某些非类型值实例化模板子类方法时产生编译器错误
- 有没有一种方法可以防止基类方法在派生类的实例上被调用
- 为什么可以从实例化基类对象的投射指针调用非静态派生类方法
- 从基类实例调用派生类方法
- 在其实例类方法中调用QMainWindow方法