目标C++调用目标C
我有咆哮的行动,我需要从目标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++?
从我收集你想要提供一个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
我不知道你叫什么名字的Objective-C++,但上面的代码,只要它是一个Objective-C @implementation
部分,将编译有或无的Objective-C++启用(.m
或.mm
扩展)的罚款。
顺便说一句,如果你使用的Xcode 4.4或以上,以下将做的一样好:
- (NSDictionary*) registrationDictionaryForGrowl {
return @{
GROWL_NOTIFICATIONS_ALL : @[ @"Alert" ],
GROWL_NOTIFICATIONS_DEFAULT : @[ @"Alert" ] };
}
在Objective-C++有C++类和Objective-C类。没有Objective-C++类。实现registrationDictionaryForGrowl
的GrowlApplicationBridgeDelegate
必须是Objective-C对象。您可以在.mm文件中将它定义为完全相同。唯一的区别是,在.mm文件中,您定义的Objective-C类可以调用并使用C++类和语法。
我需要把它放在一个C++类和函数中。我可以把@implementation放在最上面然后把它放到C++类和函数中吗?我也认为' - ...'不能被抛入函数中? – Steven 2012-07-19 22:22:20
我不知道为什么你需要这样做。但是Growl是在ObjC中实现的,并且期望委托是一个ObjC实例。你不能为Growl提供一个C++实例。也就是说,你可以在C++实例中使用ObjC实例,反之亦然。要点是,C++和ObjC对象之间没有免费桥接。 – 2012-07-19 22:25:28