1

Objective C++ から呼び出す必要があるうなるアクションがあります。

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

は Objective C のアクションですが、.mmファイル (Objective C++) に配置する必要があり、(C++) 関数内の (C++) 関数内に配置する必要があるため、適切に変換するのに苦労しています。クラス。

これをObjective C++に転送する方法はありますか?

4

3 に答える 3

2

私が収集したものから、Objective-C オブジェクトを期待する Growl に 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++ クラスをラップし、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
于 2012-07-19T22:40:15.463 に答える
2

Objective-C++ には、C++ クラスと Objective-C クラスがあります。Objective-C++ クラスはありません。GrowlApplicationBridgeDelegate実装するはregistrationDictionaryForGrowl、Objective-C オブジェクトでなければなりません。.m ファイルとまったく同じように .mm ファイルで定義できます。唯一の違いは、.mm ファイルでは、定義した Objective-C クラスが C++ クラスと構文を呼び出して使用できることです。

于 2012-07-19T22:25:32.070 に答える
1

Objective-C++ を何と呼んでいるのかわかりませんが、上記のコードは、Objective-Cセクションにある場合、Objective-C++ が有効 (または拡張機能)@implementationの有無にかかわらず正常にコンパイルされます。.m.mm

ところで、Xcode 4.4 以降を使用している場合は、次のようにすることもできます。

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