Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Objective-C++ - オブジェクトの相互所有

タグ: C++ Objective-C

Objective-CのクラスにC++のクラスのインスタンスを持たせるには、ポインタを使う。
ポインタを使わず、直にインスタンス変数にすることができないわけではないが、コンストラクタもデストラクタも呼ばれず、vtblの初期化も行われないので、POD以外には使えない。

class Bar;
class Baz;

@interface Foo : NSObject
{
	NSString* string; ///< Objective-Cのクラスのインスタンス
	boost::shared_ptr<Bar>* bar; ///< C++のスマートポインタインスタンス
	Baz* baz; ///< C++のオブジェクトを指すポインタ
};
- (id)initWithString:(NSString*)str bar:(const boost::shared_ptr<Bar>&)br baz:(Baz*)bz;
@end

@implementation Foo
- (id)initWithString:(NSString*)str bar:(const boost::shared_ptr<Bar>&)br baz:(Baz*)bz
{
	if(self = [super init])
	{
		string = [str retain];
		bar = new boost::shared_ptr<Bar>(br);
		baz = bz;
	}
	return self;
}

- (void)dealloc
{
	delete bar;
	[string release];
	[super dealloc];
}
@end

C++のクラスにObjective-Cのクラスのインスタンスを持たせる場合は、生のポインタの他に、スマートポインタも使える。

class Bar;
class Baz;

class Foo
{
public:
	Foo(NSString* str, const boost::shared_ptr<Bar>& br, Baz* bz);
	
private:
	boost::intrusive_ptr<NSString> string; ///< Objective-Cのオブジェクトを指すスマートポインタ
	boost::shared_ptr<Bar> bar; ///< C++のオブジェクトを指すスマートポインタ
	Baz* baz; ///< C++のオブジェクトを指すポインタ
};

void intrusive_ptr_add_ref(id obj)
{
	[obj retain];
}

void intrusive_ptr_release(id obj)
{
	[obj release];
}

Foo::Foo(NSString* str, const boost::shared_ptr<Bar>& br, Baz* bz) :
string(str),
bar(br),
baz(bz)
{
}
スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/122-9eaaf220
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。