2016-04-03 6 views
1

チェスゲームをC++でプログラミングしました。さて、Objective-C++ コントローラモデルオブジェクトを初期化し、それが代理人になるようにします。 ビューを更新する必要があり、それのタスクを終了モデルは、それがコントローラコントローラに知らせるべきであるためC++モデルでObjective-C++コントローラに委譲メソッドを通知する

、。今

私はこのようなC++ モデルインスタンス:のObjective-C++で

Model *model = new Model(); 
model->delegate = self; 

を。私が理解しているものから

Assigning to 'Delegate *' from incompatible type 'NSObject *const __strong' 

、私は匿名のコンテナ(またはタイプNSObjectののオブジェクト)であることをデリゲートの種類を行う必要があります。それは私に、このエラーが発生します。

このようにさまざまな言語を接続するときの最適な解決策は何ですか?

EDIT:

わかりましたので、私は周りの仕事を見つけましたが、今、私はメモリ管理の問題を抱えています。格納しているObjective-Cオブジェクトは、スコープを終了すると解放されます。

struct SharedObjectiveCObject { 
Class sharedObjectiveCObject; 
public: 
    SharedObjectiveCObject() : sharedObjectiveCObject([GameViewController class]) {} 
}; 



class Controller { 

private: 
    GameViewController *gameViewController; // THIS GETS RELEASED ON EXITING SCOPE (THIS IS AN OBJECT OF OBJECTIVE-C CLASS) 

public: 
    Controller() { 
     std::unique_ptr<SharedObjectiveCObject> sharedObjectiveCObject(new SharedObjectiveCObject()); 

     this->gameViewController = (__bridge GameViewController*)(sharedObjectiveCObject.get()); // THIS GETS RELEASED ON EXITING SCOPE 
    } 

SECOND EDIT:ここでは、コードですつまり

、私はthisと同じ疑問を持っています。

答えて

1

デリゲートは、適切なデリゲートプロトコルを実装するObjective Cクラスである必要があります。あなたはC++オブジェクトに固執することはできません。私の解決策は、メッセージの実際のターゲットであるC++オブジェクトへのポインタで初期化された「リレー」クラスを作成することでした。デリゲートメソッドが呼び出されると、C++オブジェクトに対して関数呼び出しが実行されます。

例は、pianod2プロジェクトのソースファイルsrc/mediaunits/audio/osxplayer.mmにあります。 PlayerHelperクラスは、(AVFoundationフレームワークの)AVPlayerとAVPlayerItemの両方のデリゲートと、osxplayer.mmで定義されたC++タイプのAVFoundationPlayerの間のシムを提供します。

+0

答えをありがとう。私はあなたのコードをチェックし、Objective-CのプロパティにC++オブジェクトを割り当てています。私はそれとは正反対のことをしたい、私はC + +でObjective-Cのリファレンスを格納したいので、いつでも、私はそれに委任メッセージを送信することができます。それが私が望むものです。 Objective-Cオブジェクトは、タイプを知らずにいつでもメッセージを送信できます。 –

+0

私は何かを試しました。それは働いていましたが、私が格納しているObjective-Cオブジェクトが解放されるため、メモリ管理の問題が発生しています。それは長い間保持されません。親切に編集を参照してください。 –

+1

あなたはunique_ptrに値を入れて、次に.get()を使ってそれをコピーします。これにより、ポインターはunique_ptrの手の中に残され、スコープから外れると破棄されます。 .release()を代わりに使用してください。代わりに*ポインタを移動します。 –

関連する問題