Hatena::ブログ(Diary)

Faith and Brave - C++で遊ぼう このページをアンテナに追加 RSSフィード Twitter

2008-08-22

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

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

なまえなまえ 2008/08/23 17:53 C++/CLIでも似たような技がつかえますねー

faith_and_bravefaith_and_brave 2008/08/23 23:13 ですねー

faith_and_bravefaith_and_brave 2012/01/16 12:18 情報が古くなってるのと、記事に嘘が含まれていたのでコメントで訂正します。

まず、ヘッダーファイルでObjective-CとC++の混在コードは記述できます。
それと、Objective-CクラスのメンバとしてC++クラスのオブジェクトを定義した場合、C++のコンストラクタとデストラクタが自動的に呼ばれるオプションが提供されていて、現在はそのオプションがデフォルトでONになっています。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/faith_and_brave/20080822/1219396399