Entries

スポンサーサイト

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

プロパティとC++オブジェクト

タグ: Objective-C C++

Objective-C 2.0のメソッドはC++のオブジェクトを参照型で受け渡しできる(値渡しもできる)。

#include <boost/shared_ptr.hpp>

class Foo;

@interface Bar : NSObject
{
	boost::shared_ptr<const Foo>* foo;
}

- (const boost::shared_ptr<const Foo>&)foo;
- (void)setFoo:(const boost::shared_ptr<const Foo>&)newFoo;

@end

Objective-C 2.0はC++のオブジェクトもポインタならプロパティにできる。

- (boost::shared_ptr<const Foo>*)foo;
- (void)setFoo:(boost::shared_ptr<const Foo>*)newFoo;

@property boost::shared_ptr<const Foo>* foo;

ならば以下の様に記述すれば参照型のプロパティも宣言可能か。

- (const boost::shared_ptr<const Foo>&)foo;
- (void)setFoo:(const boost::shared_ptr<const Foo>&)newFoo;

@property const boost::shared_ptr<const Foo>& foo;

答え:internal compiler error: Bus error

const参照を非const参照に変えてもダメ。
readonlyにしてもダメ。
参照にsetterは有り得ないので理解できるが、getterのみでもダメか。

ではC++のオブジェクトそのものをプロパティにしたらどうなるだろう。

- (boost::shared_ptr<const Foo>)foo;
- (void)setFoo:(boost::shared_ptr<const Foo>)newFoo;

@property boost::shared_ptr<const Foo> foo;

答え:setterが呼ばれない

値を代入しようとしても、getterの戻り値である一時オブジェクトに代入してしまう。

結局、C++のオブジェクトをObjective-Cクラスのプロパティにするには、ポインタを使う他ないようだ。

スポンサーサイト

コメント

コメントの投稿

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

トラックバック

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

Appendix

タグ

Blog内検索

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