Using C++ With Objective-C

轉載自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-CC++混編的要點
在 Objective-C++中,可以用C++代碼調用方法也可以從Objective-C調用方法。在這兩種語言裏對象都是指針,可以在任何地方使用。例 如,C++類可以使用Objective-C對象的指針作爲數據成員,Objective-C類也可以有C++對象指針做實例變量。下例說明了這一點。
注意:Xcode需要源文件以".mm"爲擴展名,這樣才能啓動編譯器的Objective-C++擴展。

  1. /* Hello.mm
  2.  * Compile with: g++ -x objective-c++ -framework Foundation Hello.mm  -o hello
  3.  */
  4. #import <Foundation/Foundation.h>
  5. class Hello {
  6. private:
  7.     id greeting_text;  // holds an NSString
  8. public:
  9.     Hello() {
  10.         greeting_text = @"Hello, world!";
  11.     }
  12.     Hello(const char* initial_greeting_text) {
  13.         greeting_text = [[NSString alloc] initWithUTF8String:initial_greeting_text];
  14.     }
  15.     void say_hello() {
  16.         printf("%s\n", [greeting_text UTF8String]);
  17.     }
  18. };
  19. @interface Greeting : NSObject {
  20. @private
  21.     Hello *hello;
  22. }
  23. - (id)init;
  24. - (void)dealloc;
  25. - (void)sayGreeting;
  26. - (void)sayGreeting:(Hello*)greeting;
  27. @end
  28. @implementation Greeting
  29. - (id)init {
  30.     if (self = [super init]) {
  31.         hello = new Hello();
  32.     }
  33.     return self;
  34. }
  35. - (void)dealloc {
  36.     delete hello;
  37.     [super dealloc];
  38. }
  39. - (void)sayGreeting {
  40.     hello->say_hello();
  41. }
  42. - (void)sayGreeting:(Hello*)greeting {
  43.     greeting->say_hello();
  44. }
  45. @end
  46. int main() {
  47.     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  48.    
  49.     Greeting *greeting = [[Greeting alloc] init];
  50.     [greeting sayGreeting];                         // > Hello,  world!
  51.    
  52.     Hello *hello = new Hello("Bonjour, monde!");
  53.     [greeting sayGreeting:hello];                   // > Bonjour,  monde!
  54.    
  55.     delete hello;
  56.     [greeting release];
  57.     [pool release];
  58.     return 0;
  59. }

正如你可以在OC接口中聲明C結構一樣,你也可以在OC接口中聲明C++類。跟C結構一樣,OC接口中定義的C++類是全局範圍的,不是OC類的內嵌類(這與標準C(儘管不是C++)提升嵌套結構定義爲文件範圍是一致的)。
爲了允許你基於語言變種條件化地編寫代碼,OC++編譯器定義了__cplusplus和__OBJC__預處理器常量,分別指定C++和OC。    如前所述,OC++不允許C++類繼承自OC對象,也不允許OC類繼承自C++對象。

  1. class Base { /* ... */ };
  2. @interface ObjCClass: Base ... @end // ERROR!
  3. class Derived: public ObjCClass ... // ERROR!

與 OC不同的是,C++對象是靜態類型的,有運行時多態是特殊情況。兩種語言的對象模型因此不能直接兼容。更根本的,OC和C++對象在內存中的佈局是互不 相容的,也就是說,一般不可能創建一個對象實例從兩種語言的角度來看都是有效的。因此,兩種類型層次結構不能被混合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章