2017-04-09 8 views
0

私はネットワーキングのために(boost :: asioを介して)使用するC++クラスを持っています。これは便利なことをするためにコールバック関数を使う必要があります。 私は、このクラスを利用するObjective-C++の混合プロジェクトも持っています。 にObjCクラスのシングルトンを使用して、私のサブクラスUIViewControllerクラスのそれぞれは、順番に、シングルトンインスタンスを経由して、それぞれのクラスのメンバメソッドを呼び出してそのクラスの実装ファイル内で定義された標準のC/C++方法、に結合することが可能である:関数は、C++で使用するobjcクラスメンバメソッドへのポインタですか?

@interface MyViewControllerClass() 
+ (instancetype)Instance; 
@end 

MyViewControllerClass *_MyViewControllerClass_Instance; 

void cppCallback() { 
    // This method gets called from the C++ class 
    [[MyViewControllerClass Instance] objcCallback]; 
} 

@implementation MyViewControllerClass 

+ (instancetype)Instance { 
    return _MyViewControllerClass_Instance; 
} 

- (void)viewDidLoad 
{ 
    _MyViewControllerClass_Instance = self; 
    // Pass &cppCallback to the C++ class here, so it can be called later 
} 

- (void)objcCallback { 
    ;// Do something here 
} 
@end 

これは見た目が醜いので、過去にはうまくいきました。しかし、今私は新しい壁を打ちました... UICollectionViewCellサブクラスの中からC++ネットワーキングクラスを利用する必要があります。これはシングルトンの使用がうまくいかないことを意味します。

どうすればobjcクラスメソッドへのポインタをC++パラメータとして渡すことができますか?
私の唯一のオプションは、Objective-CラッパークラスをC++ネットワーキングクラス用に書くことですか?

+0

コールバックにはユーザー、情報などの引数はありません。通常、コールバックはこの問題を正確に解決するためにこれを行います。 –

答えて

1

関数ポインタを使用してインスタンスメソッドを呼び出すことはできないため(関数ポインタを使用してインスタンスを渡す場合を除き)、「関数ポインタ」は使用できません。

ただし、呼び出し可能オブジェクトを作成することはできます。

struct Callback { 
    MyViewControllerClass *instance; 
    void operator()() { 
     [instance objcCallback]; 
    } 
}; 

曖昧なC++ラムダを使用することもできます。

+0

私はこの考えが好きです。私はテストにそれを置く必要があります、ありがとう! – RectangleEquals

+0

私は非常に似通ったコールバック構造体を使用するテンプレートクラスのネットワーククラスを作りましたが、 'conformsToProtocol:'チェックも行いました。再度、感謝します! – RectangleEquals

関連する問題