Objective-C と C++ のコードは、 *.mm 形式のファイルの中では混在させることができます。
なので、 Objective-C のライブラリを C++ でラップしてしまえば、ほとんどが C++ で組めるようになります。
以下はその方法
*.h では混在コードを書けないので、 C++ のクラスのメンバとして
Objective-C のオブジェクトを持つには PImplイディオム を使用します。
Cpp.h
#ifndef CPP_INCLUDE #define CPP_INCLUDE #include <boost/shared_ptr.hpp> class CppHoge { struct Impl; boost::shared_ptr<Impl> pImpl_; public: CppHoge(); ~CppHoge(); void doSomething(); }; #endif // CPP_INCLUDE
Cpp.mm
#include "Cpp.h" struct CppHoge::Impl { NSString *str; // Objective-C のオブジェクト }; CppHoge::CppHoge() : pImpl_(new Impl) { pImpl_->str = [[NSString alloc] init]; } CppHoge::~CppHoge() { [pImpl_->str release]; } void CppHoge::doSomething() { int length = [pImpl_->str length]; }
次に、 Objective-C のクラスメンバで C++ のオブジェクトを持つためにはポインタを使用します。
(コンストラクタ/デストラクタではなく、 init/dealloc を使用するため)
ObjCpp.h
#include "Cpp.h" @interface ObjCpp : NSObject { CppHoge *cppHoge_; } @end
ObjCpp.mm
#import "ObjCpp.h" @implementation ObjCpp - (id)init { if (self = [super init]) { cppHoge_ = new CppHoge; } return self; } - (void)doSomething { cppHoge_->doSomething(); } - (void)dealloc { delete cppHoge_; [super dealloc]; } @end