2012-12-11 54 views
2

Objective-C类可能有一个C++接口类型的实例变量吗?Objective-C可以使用C++接口吗?

我可以声明Xcode的C++类精(它编译)像这样:

class MyClass { 
    void MyMethod(); 
} 

,但如果我当我尝试申报这样的接口:

interface class MyClass { 
    void MyMethod(); 
} 

我得到一个在编译过程中出现错误:Unknown type name 'interface'

我甚至没有尝试将它放入ObjC类中,但它根本无法编译。尽可能使用C++接口?

+2

我最近没有做过太多的C++,但是从什么时候开始C++有接口? –

+0

我以为它确实有接口,因为我通常只使用微软版本。 – Curyous

回答

2

interface关键字是微软扩展的语言;它不存在于标准C++中。这就是你遇到的问题。您不能在任何使用非Microsoft编译器编译的C++程序中使用它们,因此假定Microsoft不生成Objective-C编译器,否则不能在Objective-C中使用它们。

类或结构可以用于相同的目的。 AFAIK,接口是简单的虚拟类,强加一些额外的限制,所以你只需要确保自己遵循那些。

2

是的,这是可能的;它被称为Objective-C++。

只需使用.mm文件扩展名为您的实现文件命名,并且您可以在C++中执行几乎任何操作。

但是你不能做的一件事是把C++类作为Objective-C++类的子类;改用封装:

MyObjCppClass.h:

#import "MyCppClass.h" 

@interface MyObjCppClass : NSObject 
{ 
    MyCppClass *_myCppClass; 
} 

@end 

MyObjCppClass.mm:

#import "MyObjCppClass.h" 

@implemenation MyObjCppClass 

- (id)init 
{ 
    self = [super init]; 
    if (self != nil) 
    { 
     _myCppClass = new MyCppClass; 
     _myCppClass->doThing(); 
    } 
    return self; 
} 

- (void)dealloc 
{ 
    delete _myCppClass; 
    [super dealloc]; 
} 

@end 
+0

需要注意的是,由于Objective-C++对象没有与C++相同的构造函数,因此不能使用自动存储持续时间对象作为成员,但可以使用动态存储持续时间对象(即,您需要使用新建/删除(如你所示))。 –

+0

@LokiAstari同意。 – trojanfoe

+0

@LokiAstari:你确定吗? AFAIK C++对象应该使用默认的构造函数创建。 – Chuck

相关问题