2009-04-12 4 views
4

私は対物レンズCでブラックジャックを作ろうとしています。私のハンドクラスは、基本的にデッキを取り、カードをカードから取り出して配列に追加します。Objective Cは、キャストのないポインタからオブジェクトをargsとしてオブジェクトを渡します。

はここ関与ハンドメソッドです:

- (id)init : (Deck*) deck 
{ 
    [self draw: deck]; 
    [self draw: deck]; 
    return self; 
} 

- (void)draw: (Deck*)deck; 
{ 
    Card* C= [deck drawFromDeck]; 
    [cards addObject: C]; 
} 

ここでは、メインの問題の一部です:

Deck* deck=[[Deck alloc] init]; 
Hand* hand=[[Hand alloc] init: deck ]; 

ことの2行目がエラー「キャストせずにポインタから整数」を取得します。私がコードを実行するたびに、手札にはカードがありません。なぜなら、そこからデッキを引くことはできないからです(私は思う:))。デッキ*を違う方法で渡したりパースする必要がありますか? (コードを投稿する必要がある場合は、尋ねてください)

ありがとうございます!私は受け入れ答えはうまく説明されていると、この質問は、過去のための17の景色日の平均を得ていると信じていないが:を報奨金に関してD



編集1年半。 これはおそらく多くの人が多くの人がstackoverflowで持っている最初の経験であることを意味し、改良すればより良い立場になるだけでなく、多くの人の時間を節約できます。それは今、良い答えを持っていますが、私はそれができるだけ完璧であることを確認したいと思います。なぜなら、その人のうち何人がそれに従って問題を解決できるのか本当に分かっていないからです。

既存の回答を編集したり、独自の回答を追加したりしてください。 (Mods、これはコミュニティウィキのための良い候補者だと思いますか?)

+0

このコードスニペットから警告を受け取ってはいけません。あなたは、メイン全体をこのポイントまでカット&ペーストすることはできますか? –

+0

特にDeckとHandの@interfaceを見ていただければ幸いです。 –

+0

私はinit:メソッドがインターフェイスで宣言されていないと思う。また、一般的な規約であるCrazyJugglerDrummerは、メソッド名に次の引数のラベルを含めることです:initWithDeck:(Deck *)deck – philsquared

答えて

12

問題は、あなたは下の投稿した余分なコードに基づいて、同じ名前の2つのメソッドを持っていますが、そのパラメータ、すなわち- (id)init: (Deck*)deck- (id)init: (int)newvalue、一致していないということです。

通常、これは問題ではありませんが、この場合、型は構造的に異なります。ポインタとintです。コンパイラはレシーバのタイプに基づいて何を意味するのかを区別することができますが、これはスタティック型の場合にのみ機能します。たとえば、次のような場合:

Hand *h = [Hand alloc]; 
h = [h init: deck]; 

警告が表示されなくなります。これは非常に珍しいコードですが、 - allocとinitはほとんど同じ行になります。 alloc以来

idを返し、ないHandそれが[[Hand alloc] init:deck]でのinit呼び出しがHand、およびないCardにあることを知りません。詳細については、Apple's Docs on static typingを参照してください。

最も簡単な(そして妥当な)ソリューションは、引数の型を示すメソッドの名前を変更することです。たとえば、initWithCardValue:initWithDeck:を使用できます。

EDIT:また、はい、initメソッド内の適切な動作についての他の投稿からの提案に留意してください。 (警告は発生していませんが、セグメンテーションの原因になっている可能性があります)

+0

もっと冗長なinitメソッドのためにUpvoted! –

1

init:の方法で[super init]に電話しましたか?

また、カードをカードアレイに追加しています。それは正しく設定されていますか?

+0

彼はそうではないように見えます。彼はその場所でこのエラー。 –

2
  1. Phil Nashさんの質問によると、HandとDeckの両方のヘッダーをメインファイルにインポートしていることを確認してください。それは警告を止めるべきです(警告でもエラーでもありません)。あなたのinit方法(複数可)で

  2. 、それはnilを返し、それが返されなかったことを、オブジェクトを初期化していないことを確認し、[super init]を呼び出すことを忘れないでください。これを行う最も一般的な方法は次のとおりです。

    if ((self = [super init])) { 
        //Initialize here 
    } 
    return self; 
    
  3. 配列の変数を宣言するだけでは不十分です。配列を作成して変数に入れなければなりません。それでは、配列に物事を入れることができます。

関連する問題