2012-07-19 92 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++类和语法。