- 1 名前:デフォルトの名無しさん mailto:sage [2007/08/08(水) 12:18:31 ]
- Objective-C(オブジェクティブ シー)はプログラミング言語の一種。C言語をベースにSmalltalk型のオブジェクト指向機能を持たせた上位互換言語。
(Wikipedia:ja.wikipedia.org/wiki/Objective-C より) 前スレ pc11.2ch.net/test/read.cgi/tech/1106983092/ 前々スレ pc5.2ch.net/tech/kako/990/990574267.html
- 867 名前:デフォルトの名無しさん [2009/03/07(土) 18:35:46 ]
- ClassA.hで
#import <Cocoa/Cocoa.h> #import "ClassB.h" @interface ClassA : NSObject { ClassB* b; } @end ClassB.hで #import <Cocoa/Cocoa.h> #import "ClassA.h" @interface ClassB : NSObject { ClassA* a; } @end というように、互いにインスタンスを持ち合うとコンパイル時にエラーが出ますが、 ClassA.h内で #import "ClassB.h" @class ClassB; ClassB.h内で #import "ClassA.h" @class ClassA; というふうに@classディレクティブを付けることでエラーが出なくなります。 @class classnameが、classnameがクラスであることを宣言しているのはわかるのですが、 なぜこれをやると、ClassA.h、ClassB.hを互いにimportしているにもかかわらずエラーが出なくなるのでしょうか。 逆に、付けないとなぜエラーになるのでしょうか。 また、@classを付ける基準ですが、 ・そのクラスのスーパークラス ・Cocoa等のフレームワーク内のクラス を除く全てのクラスを使用する時、必ず@classをつけるという考え方で良いのでしょうか。 どなたか詳しくご存知のかたよろしくお願いします。
- 868 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 19:01:04 ]
- >>867
詳しくはないが、自分ならこう考える Objective-Cの背後にある仕組みは結局Cと何もかわらない importは本質ではなくひとつのファイルに連続して次のように書けるかという問題 Cではこう書けない struct A { struct B *b; }; struct B { struct A *a; }; なぜならAの宣言時にBはまだ宣言されていないから。しかしCでは不完全型を定義できて、 struct B; struct A { struct B *b; }; struct B { struct A *a; }; こう書く事ができる。Aの定義時にBは不完全型なのでインスタンスは作れないが、ポインタは作れる。ポインタのサイズはどの構造体でも固定だからだ で、Objective-Cでも背後で同じようなことが起きてるんだと思うよ @class B; として不完全型を定義すればそのポインタを次の行からは使えるようになる だからエラーにならない どう?
- 869 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 19:10:43 ]
- >>867
だから、@classを付ける基準は 相互に依存するクラスを定義しなければならない時、またこのときは@classを書かざるを得ない だけ それ以外は冗長で無駄
- 870 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 19:18:21 ]
- >>868
ありがとうございます。今までずっと悩んでたのですが、すっきりしました。 >>869 特別な場合を除いて不要という形ですか、ありがとうございます。
|

|