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;
}
みたいな感じ。
基本的な考え方はこれでいいんじゃないかと思う。
なにか問題などあればご指摘ください。