我有一個類卡,存儲代表等級和西裝的2個整數。我有一個Deck類,其中包含52個存儲在數組中的Card對象。當我初始化甲板時,我創建了所有52張牌,然後添加到甲板上。我應該在這種情況下使用新的嗎?
當我這樣做,我應該使用
deck[i] = Card (rank, suit);
或
deck[i] = new Card (rank, suit);
我爲什麼要使用一個或其他?
我有一個類卡,存儲代表等級和西裝的2個整數。我有一個Deck類,其中包含52個存儲在數組中的Card對象。當我初始化甲板時,我創建了所有52張牌,然後添加到甲板上。我應該在這種情況下使用新的嗎?
當我這樣做,我應該使用
deck[i] = Card (rank, suit);
或
deck[i] = new Card (rank, suit);
我爲什麼要使用一個或其他?
如果deck
是Card
一個數組,然後你想第一:deck[i] = Card (rank, suit);
如果deck
是Card*
一個數組,那麼你希望第二個:deck[i] = new Card (rank, suit);
而在後一種情況下,你想_wrongly_。 – 2012-02-26 13:13:02
因爲一個是有效的,一種是不。
如果數組包含對象,
deck[i] = Card (rank, suit);
是有效的。
如果數組包含對象的指針,
deck[i] = new Card (rank, suit);
是有效的。
如果你想編譯,你會發現你的其中一個錯誤。另一個是你想要的。
在這種情況下,使用Card
的數組或Card*
的數組存在優點和缺點。 對於指針數組,您需要在刪除數組之前手動刪除每個指針(以防止內存泄漏)。這也會在內存中佔用更多的空間。 作爲一個優勢,例如,交換兩張卡片很容易,因爲您只能交換指針。 如果你有對象,交換你需要修改它們或構建新的對象(這可能是昂貴的)。如果你選擇了指針,套牌也可以共享卡片(我不知道你爲什麼會在這種特殊情況下使用這種卡片,但爲了通用起見,這很有用)。
如果你有一個對象數組,你不需要擔心內存管理,但是你會失去這種快速交換能力。
它取決於你評估哪一個更適合應用程序,但我個人認爲你會很好的對象數組。
我回答了字面問題,但這可能是提問者正在尋找的東西。 – 2011-12-28 01:06:27
只要您爲每種情況適當地聲明deck
數組,您提出的兩個選項都是有效的。讓我討論每個選項的好處:
deck[i] = Card (rank, suit);
Card
類很簡單,編譯器生成的默認複製和賦值邏輯就足夠了,您可以使用Card
實例,就好像它們是分配它們或將它們作爲參數傳遞的基本類型一樣。deck[i] = new Card (rank, suit);
Card
實例需要將類的全部內容從內存中的一個位置複製到另一個位置。在我看來,這兩種方法都沒有明顯的優勢,如果Card
的課程太小,更是如此。我可能會自己用指針,但使用對象也不是一個壞的選擇。
祝你好運。
如果聲明的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);
}
內存管理在C++中是一件複雜的事情。人們寫關於它的書籍。你應該閱讀它們。 – 2011-12-28 00:25:45