cocos2d-xでiOS用のアプリを作っていると、C++のクラスにObjective-Cのクラスをメンバ変数として定義したい、というケースがある。
たとえば、Objective-Cで記述されたクラスObjCがあるとする。
これをC++で記述するクラスCppのメンバ変数として定義したい場合。
できることなら、Cpp.hに
#import "ObjC.h" class Cpp { ObjC *_objc; ... };
と記述したいところだけど、ヘッダファイルにはC++とObjective-Cとを混在させられないらしく、できない。
そこで内部クラスというものを利用してみる。
class Cpp { class Inner; // InnerというクラスをCppの内部に宣言し、 Inner *_inner; // それをメンバ変数とする。 ... };
この内部クラスInnerの定義はソースファイルの中に記述できる点がミソだ。
Cpp.mm
#import "ObjC.h" // 拡張子.mmのソースファイルの中なので、Objective-Cが使える。 // Innerの定義。 class Cpp::Inner { ObjC *_objc; public: Inner() { _objc = [ObjC new]; } ~Inner() { _objc = nil; } // ObjCのメソッドを呼び出すためのラッパー void doObjcMethod() { [_objc doObjcMethod]; } }; // Cppの定義 Cpp::Cpp() { // Innerクラスのインスタンスを作成 _inner = new Inner(); // Innerクラスを介して、ObjCにアクセスする。 _inner->doObjcMethod(); } Cpp::~Cpp() { delete _inner; _inner = NULL; }
みたいな感じ。
基本的な考え方はこれでいいんじゃないかと思う。
なにか問題などあればご指摘ください。