2011-12-28 174 views
-1

我有一個類卡,存儲代表等級和西裝的2個整數。我有一個Deck類,其中包含52個存儲在數組中的Card對象。當我初始化甲板時,我創建了所有52張牌,然後添加到甲板上。我應該在這種情況下使用新的嗎?

當我這樣做,我應該使用

deck[i] = Card (rank, suit); 

deck[i] = new Card (rank, suit); 

我爲什麼要使用一個或其他?

+11

內存管理在C++中是一件複雜的事情。人們寫關於它的書籍。你應該閱讀它們。 – 2011-12-28 00:25:45

回答

5

如果deckCard一個數組,然後你想第一:deck[i] = Card (rank, suit);

如果deckCard*一個數組,那麼你希望第二個:deck[i] = new Card (rank, suit);

+0

而在後一種情況下,你想_wrongly_。 – 2012-02-26 13:13:02

3

因爲一個是有效的,一種是不。

如果數組包含對象,

deck[i] = Card (rank, suit); 

是有效的。

如果數組包含對象的指針,

deck[i] = new Card (rank, suit); 

是有效的。

如果你想編譯,你會發現你的其中一個錯誤。另一個是你想要的。

2

在這種情況下,使用Card的數組或Card*的數組存在優點和缺點。 對於指針數組,您需要在刪除數組之前手動刪除每個指針(以防止內存泄漏)。這也會在內存中佔用更多的空間。 作爲一個優勢,例如,交換兩張卡片很容易,因爲您只能交換指針。 如果你有對象,交換你需要修改它們或構建新的對象(這可能是昂貴的)。如果你選擇了指針,套牌也可以共享卡片(我不知道你爲什麼會在這種特殊情況下使用這種卡片,但爲了通用起見,這很有用)。

如果你有一個對象數組,你不需要擔心內存管理,但是你會失去這種快速交換能力。

它取決於你評估哪一個更適合應用程序,但我個人認爲你會很好的對象數組。

+0

我回答了字面問題,但這可能是提問者正在尋找的東西。 – 2011-12-28 01:06:27

3

只要您爲每種情況適當地聲明deck數組,您提出的兩個選項都是有效的。讓我討論每個選項的好處:

deck[i] = Card (rank, suit);

  • 無需管理內存,因爲所有的分配是隱式由編譯器管理。使用指針需要更多的努力。
  • 假設Card類很簡單,編譯器生成的默認複製和賦值邏輯就足夠了,您可以使用Card實例,就好像它們是分配它們或將它們作爲參數傳遞的基本類型一樣。
  • 通過仔細使用引用,您可能能夠減少實例的複製並最大限度地降低與此相關的性能損失。

deck[i] = new Card (rank, suit);

  • 每張卡是通過遊戲的生命是獨一無二的。使用獨一無二的卡片來模擬遊戲可能會更容易。
  • 更高效。將卡作爲參數傳遞只是傳遞一個指針,不管每個實例有多大,同樣也適用於在不同數組之間移動卡。與另一種情況相比,按值移動Card實例需要將類的全部內容從內存中的一個位置複製到另一個位置。
  • 如果卡片是唯一的並且從不復制,則可能更容易調試遊戲的狀態。

在我看來,這兩種方法都沒有明顯的優勢,如果Card的課程太小,更是如此。我可能會自己用指針,但使用對象也不是一個壞的選擇。

祝你好運。

1

如果聲明的Card項的數組,那麼項目將默認構造當數組分配,然後你必須回去以後更新個人Card項目與他們的新值,例如:

Card deck[52]; 
for (int i = 0; i < 52; ++i) 
{ 
    rank = ...; 
    suit = ...; 
    deck[i] = Card(rank, suit); 

    // better, add a method to the `Card` class to 
    // update the values without constructing any 
    // temporary instances at all... 
    // 
    // deck[i].set(rank, suit); 
} 

如果聲明的Card指針數組,那麼你可以使用你的Card構造所需值初始化每個Card項目,但在每個Card項目分配一個單獨的內存塊的成本,如:

Card* deck[52]; 
for (int i = 0; i < 52; ++i) 
{ 
    rank = ...; 
    suit = ...; 
    deck[i] = new Card(rank, suit); 
} 

您可以將二者結合起來,如果你使用std::vector不是數組,例如:

std::vector<Card> deck(52); 
for (int i = 0; i < 52; ++i) 
{ 
    rank = ...; 
    suit = ...; 
    deck[i] = Card(rank, suit); 

    // or: 
    // deck[i].set(rank, suit); 
} 

如果使用placement new操作,那麼實際上你可以利用「新」運營商打電話給你Card構造,而不用於每個Card分配一個單獨的存儲塊,而不必爲默認構建體,然後分別複製分配Card值,例如:

unsigned char deck_buffer[sizeof(Card) * 52]; 
Card *deck = (Card*) deck_buffer; 
for (int i = 0; i < 52; ++i) 
{ 
    rank = ...; 
    suit = ...; 
    new (&deck[i]) Card(rank, suit); 
} 
相關問題