1

我有一个需要从 Objective C++ 调用的咆哮动作

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

是目标 C 中的操作,但我需要将它放在一个.mm文件(目标 C++)中,我很难尝试正确转换它,因为我需要将它放在(C++)内的(C++)函数中(C++)班级。

知道如何将其转移到Objective C++吗?

4

3 回答 3

2

在 Objective-C++ 中有 C++ 类和 Objective-C 类。没有 Objective-C++ 类。GrowlApplicationBridgeDelegatewhich 实现registrationDictionaryForGrowl必须是一个 Objective-C 对象。您可以在 .mm 文件中定义与在 .m 文件中完全相同的定义。唯一的区别是在您的 .mm 文件中,您定义的 Objective-C 类可以调用和使用 C++ 类和语法。

于 2012-07-19T22:25:32.070 回答
2

从我收集到的信息中,您想为 Growl 提供一个 C++ 对象,它需要和 Objective-C 对象。你不能这样做。

Objective-C 是一组焊接到 C 上的语言扩展。Objective-C++ 是将完全相同的扩展焊接到 C++ 上的结果。所以在 Objective-C++ 中你有 Objective-C 风格的对象和 C++ 对象,它们是完全不同的东西。当需要另一个时,不能使用一个。它们具有不同的 ABI、用于解决方法调用/消息发送的不同方案、不同的生命周期管理等。

Objective-C++ 的目的不是让 Objective-C 对象和 C++ 对象兼容,而只是让 Objective-C 代码可以在 C++ 中使用,而 C++ 代码可以在 Objective-C++ 中使用。

所以你可以做的是创建你想用作委托的 C++ 类,然后创建一个包装你的 C++ 类的 Objective-C++ 类,并具有简单地转发到你的 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
于 2012-07-19T22:40:15.463 回答
1

我不知道你怎么称呼 Objective-C++,但上面的代码,只要它在一个 Objective-C@implementation部分中,无论是否启用 Objective-C++(.m.mm扩展)都可以正常编译。

顺便说一句,如果您使用的是 Xcode 4.4 或更高版本,以下内容也可以:

- (NSDictionary*) registrationDictionaryForGrowl {
    return @{
        GROWL_NOTIFICATIONS_ALL : @[ @"Alert" ],
        GROWL_NOTIFICATIONS_DEFAULT : @[ @"Alert" ] };
}
于 2012-07-19T22:19:11.247 回答