2012-07-19 105 views
1

我有咆哮的行動,我需要從目標C++目標C++調用目標C

- (NSDictionary *) registrationDictionaryForGrowl { 
    return [NSDictionary dictionaryWithObjectsAndKeys: 
      [NSArray arrayWithObject:@"Alert"], GROWL_NOTIFICATIONS_ALL, 
      [NSArray arrayWithObject:@"Alert"], GROWL_NOTIFICATIONS_DEFAULT 
      , nil]; 
} 

在Objective C中的行動電話,但我需要把它放在一個.mm文件(目標C++)和我因爲我需要將它放入(C++)類中的(C++)函數中,所以很難正確轉換它。

任何想法如何將其轉移到Objective C++?

回答

2

從我收集你想要提供一個C++對象咆哮,其中期望和Objective-C對象。你不能這樣做。

Objective-C是一組焊接在C上的語言擴展。Objective-C++是將完全相同的擴展焊接到C++上的結果。所以在Objective-C++中,您既有Objective-C樣式對象又有C++對象,它們是完全不同的東西。當另一個預期的時候不能使用。他們有不同的ABI,不同的方案解決方法調用/消息發送,不同的生命週期管理等

的Objective-C的目的++是不是讓Objective-C對象和C++對象是兼容的,而僅僅是爲了使目標-C代碼可用於Objective-C++中可用的C++和C++代碼。

所以你可以做的是創造你的C要作爲代表來使用,然後創建一個包裝你的C++類,具有方法簡單地期待你的C++類的實例,一個Objective-C++類++類。

class Foo { 
    int bar(int i) { return i+1; } 
}; 

@interface ObjCFoo : NSObject 
{ 
    Foo foo; 
} 

- (int) bar:(int) i; 
@end 

@implementation ObjFoo 
- (int) bar:(int) i; 
{ 
    return foo.bar(i); 
} 
@end 
1

我不知道你叫什麼名字的Objective-C++,但上面的代碼,只要它是一個Objective-C @implementation部分,將編譯有或無的Objective-C++啓用(.m.mm擴展)的罰款。

順便說一句,如果你使用的Xcode 4.4或以上,以下將做的一樣好:

- (NSDictionary*) registrationDictionaryForGrowl { 
    return @{ 
     GROWL_NOTIFICATIONS_ALL : @[ @"Alert" ], 
     GROWL_NOTIFICATIONS_DEFAULT : @[ @"Alert" ] }; 
} 
+0

我需要把它放在一個C++類和函數中。我可以把@implementation放在最上面然後把它放到C++類和函數中嗎?我也認爲' - ...'不能被拋入函數中? – Steven 2012-07-19 22:22:20

+0

我不知道爲什麼你需要這樣做。但是Growl是在ObjC中實現的,並且期望委託是一個ObjC實例。你不能爲Growl提供一個C++實例。也就是說,你可以在C++實例中使用ObjC實例,反之亦然。要點是,C++和ObjC對象之間沒有免費橋接。 – 2012-07-19 22:25:28

2

在Objective-C++有C++類和Objective-C類。沒有Objective-C++類。實現registrationDictionaryForGrowlGrowlApplicationBridgeDelegate必須是Objective-C對象。您可以在.mm文件中將它定義爲完全相同。唯一的區別是,在.mm文件中,您定義的Objective-C類可以調用並使用C++類和語法。