2011-09-26 10 views
8

オブジェクトの配列を初期化し、私はいくつかの初期化コードとのトラブルを抱えている:私は現在、カードゲームに取り組んでいます

// in my class... 
Card cards[20]; 
// in method... 
for(int i = 0; i <= 20;i++) 
    cards++ = new Card(i, /*i as char +*/ "_Card.bmp"); 

トラブルが私のコンパイラのがcards++はリットルではないことを私に告げることです-値。ポインタ配列の等価物全体を読み上げましたが、私はそれを理解していると思っていましたが、うーん、それを動作させることはできません。 cardsがポインタに劣化し、new演算子が私の新しいカードインスタンスの場所へのポインタを与えるので、私の理解は、上記のコードはコンパイルする必要があります。右?

添え字も試してみましたが、cards+icards++cards[i]という同じことを言っているだけではありませんか?私はそれらのそれぞれがl値であり、ポインタとして扱われると考えました。

+1

カード+私はカード+ iを返します。カード++はカードを1つずつインクリメントします。 cards [i]は、カードのi番目の要素への参照を返します。彼らはすべて異なっている。 –

答えて

15
Card cards[20]; 

cardsはすでにオブジェクトの配列です。それらはデフォルトコンストラクタ(引数のないコンストラクタ)で構築されます。もう一度newする必要はありません。おそらく、コンストラクタ引数に相当するメンバ関数が必要であり、それを介して代入する必要があります。

for (int i=0; i<20; ++i) // array index shouldn't include 20 
    cards[i].memberFunction(/*....*/); 

さらに簡単にstd::vector

std::vector<Card> cards; 
for(int i=0; i<20; ++i) 
    cards.push_back(Card(i, /*i as char +*/ "_Card.bmp");) 
+0

私はベクトルがより良い考えであると考えました。だから、私はベクトルを使ってみましたが、私は多くのことを実行しています。を一度組み込むと、libcpmtd.libからの「未解決の外部」エラーのリストが得られます。これは私のコードに間違いがないことを私に伝えますが、私はまだコンパイルしません。 –

+1

私はstd :: vectorを使用して、追加する要素の数を使用したいと思います。push_backを使用しないでください。オーバーヘッドは小さいですが回避できません。 正しいサイズのベクトルを初期化する必要があります。 'std :: vector cards(20);'配列の場合と同じようにメンバーを初期化します。 –

3

コードCard cards[20];既に20個のCardオブジェクトの配列を作成し、デフォルトコンストラクタでそれらを作成し使用することです。これはあなたのコードを与えたいとは思っていないかもしれません。

代わりにvectorを使用することをおすすめします。あなたのforループは配列の最後を過ぎ20から0ので、1から行く

std::vector<Card> cards; 

for(int i = 0; i < 20;i++) 
{ 
    cards.push_back(Card(i, /*i as char +*/ "_Card.bmp")); 
} 

注意。

0

の不必要なサイズ変更を避けたい場合、C++は通常、各オブジェクトを割り当てられた状態で1つずつ初期化するため、より複雑です。回避策の一つは、それをJavaの道を行うことです - ので、同じように、ループやポインタの配列を使用します。

Card *cards[20]; 
for (int i=0; i<20; i++) { 
    cards[i] = new Card(i); 
} 

別のオプションが明示的に初期化されていないメモリを取得するためのmallocを使用することです:

Card *cards = malloc(20 * sizeof(Card)); 
for (int i=0; i<20; i++) { 
    new (&(cards[i])) Card(i); 
} 
関連する問題