Do not lift a finger
ローマの休日のために朝方まで起きてしまった。朝日を感じながら寝る。
そして起きたのが19:30頃。せっかくの3連休、なにもできないぞこりゃ。
オブジェクト指向プログラミング入門 第2版 Timothy A. Budd、「第3章クラスとメソッド」と「第4章メッセージとインスタンスと初期化の例題をXcodeでビルドしてみる。
プロジェクトは「ファイルメニュー>新規プロジェクト>Command Line Utility>Standard Tool」としてプロジェクトのmain.cをmain.mに変更。
「プロジェクト>プロジェクト設定を編集」で「"プロジェクト"Card""の情報」を開き、「ビルド」タブ、「すべての構成」、「すべての設定」、「リンク」、「他のリンカフラグ」に「-lobjc」を設定しておく。
まず、@interfaceの
-(void) drawAt:(int) and:(int); //error: syntax error before ';' token
宣言がエラーになる。
どうやら仮引数を指定しないといけないようだ。次のように変更。
-(void) drawAt:(int)x and:(int)y;
「4.3.3 Objective-C における創出初期化」のp108では、
なお工場メソッドにおいてインスタンス変数が使われても、
Objective-Cのコンパイラは警告メッセージをだしません。
とあったがどうやらGCC4では警告が出る様子。
なのでメソッドを呼び出して初期化することにした。
+suit:(int)s rank:(int)r { self = [Card new]; //suit = s; // warning: instance variable 'suit' accessed in class method //rank = r; // warning: instance variable 'rank' accessed in class method [self suit:s rank:r]; return self; }
main関数は仮に次のようにしてみた。
const char *SuitString[] = { "Heart", "Club", "Diamond", "Spade" }; const char *ColorString[] = { "Red", "Black" }; const char *FaceUpString[] = { "NO", "YES" }; int main(int argc, char *argv[]) { id aCard = [Card suit:Heart rank:1]; id newCard = [aCard copy]; [aCard flip]; printf("suit %s, color %s, rank %d, faceUp %s\n", SuitString[[aCard suit]], ColorString[[aCard color]], [aCard rank], FaceUpString[[aCard faceUp]]); // --> suit Heart, color red, rank 1, faceUp YES [aCard free]; [newCard free]; return 0; }