Objective-CのクラスをC++でラップする方法

Objective-CC++ のコードは、 *.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