轉載自http://www.devdiv.com/home.php?mod=space&uid=30695&do=blog&id=6184
與 OC不同的是,C++對象是靜態類型的,有運行時多態是特殊情況。兩種語言的對象模型因此不能直接兼容。
C++類可以使用Objective-C對象的指針作爲數據成員,Objective-C類也可以有C++對象指針做實例變量。
Using C++ With Objective-C
已有 105 次閱讀 2011-11-4 11:03
Using C++ With Objective-C
蘋果的Objective-C編譯器允許用戶在同一個源文件裏自由地混合使用C++和Objective-C,混編後的語言叫Objective-C++。有了它,你就可以在Objective-C應用程序中使用已有的C++類庫。
Objective-C和C++混編的要點
在 Objective-C++中,可以用C++代碼調用方法也可以從Objective-C調用方法。在這兩種語言裏對象都是指針,可以在任何地方使用。例
如,C++類可以使用Objective-C對象的指針作爲數據成員,Objective-C類也可以有C++對象指針做實例變量。下例說明了這一點。
注意:Xcode需要源文件以".mm"爲擴展名,這樣才能啓動編譯器的Objective-C++擴展。
-
/* Hello.mm
-
* Compile with: g++ -x objective-c++
-framework Foundation Hello.mm -o hello
-
*/
-
-
#import <Foundation/Foundation.h>
-
class Hello {
-
private:
-
id greeting_text; // holds an NSString
-
public:
-
Hello() {
-
greeting_text = @"Hello, world!";
-
}
-
Hello(const char* initial_greeting_text) {
-
greeting_text = [[NSString alloc] initWithUTF8String:initial_greeting_text];
-
}
-
void say_hello() {
-
printf("%s\n", [greeting_text UTF8String]);
-
}
-
};
-
-
@interface Greeting : NSObject {
-
@private
-
Hello *hello;
-
}
-
- (id)init;
-
- (void)dealloc;
-
- (void)sayGreeting;
-
- (void)sayGreeting:(Hello*)greeting;
-
@end
-
-
@implementation Greeting
-
- (id)init {
-
if (self = [super init]) {
-
hello = new Hello();
-
}
-
return self;
-
}
-
- (void)dealloc {
-
delete hello;
-
[super dealloc];
-
}
-
- (void)sayGreeting {
-
hello->say_hello();
-
}
-
- (void)sayGreeting:(Hello*)greeting {
-
greeting->say_hello();
-
}
-
@end
-
-
int main() {
-
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-
-
Greeting *greeting = [[Greeting alloc] init];
-
[greeting sayGreeting]; // > Hello, world!
-
-
Hello *hello = new Hello("Bonjour, monde!");
-
[greeting sayGreeting:hello]; // > Bonjour, monde!
-
-
delete hello;
-
[greeting release];
-
[pool release];
-
return 0;
-
}
|
正如你可以在OC接口中聲明C結構一樣,你也可以在OC接口中聲明
C++類。跟C結構一樣,OC接口中定義的
C++類是全局範圍的,不是OC類的內嵌類(這與標準C(儘管不是
C++)提升嵌套結構定義爲文件範圍是一致的)。
爲了允許你基於語言變種條件化地編寫代碼,O
C++編譯器定義了__cplusplus和__OBJC__預處理器常量,分別指定
C++和OC。
如前所述,O
C++不允許
C++類繼承自OC對象,也不允許OC類繼承自
C++對象。
-
class Base { /* ... */ };
-
@interface ObjCClass: Base ... @end // ERROR!
-
class Derived: public ObjCClass ... // ERROR!
|
與 OC不同的是,
C++對象是靜態類型的,有運行時多態是特殊情況。兩種語言的對象模型因此不能直接兼容。更根本的,OC和
C++對象在內存中的佈局是互不
相容的,也就是說,一般不可能創建一個對象實例從兩種語言的角度來看都是有效的。因此,兩種類型層次結構不能被混合。