Просто взяв этот фрагмент кода, вы теряете динамически созданные карты.
Card * c;
vector<Card> _shoe;
for( int i = 0; i < NUM_CARDS_IN_SHOE; i++ )
{
c = new Card();
_shoe.push_back( *c );
}
_shoe.push_back( *c )
добавляет копию объекта Card
, на который указывает c
, к вектору Card
с. После этого вам не удастся удалить исходный Card
, созданный ранее в строке.
Выделение вектора NUM_CARDS_IN_SHOE
Cards
может быть достигнуто гораздо проще, например:
std::vector<Card> _shoe( NUM_CARDS_IN_SHOE );
Если посмотреть на структуру вашей карты, похоже, что вы обладаете (или почти имеете) строгим владением объектами, поэтому я не думаю, что вам нужно динамически создавать Card
s.
Обратите внимание, что ваша локальная переменная _shoe
скрывает переменную класса _shoe
. Это, вероятно, не то, что вам нужно, так как локальный _shoe
, который вы передаете конструктору Deck
, выйдет из области видимости в конце конструктора.
Если вы переупорядочиваете переменные в SolitaireGame
, вы, вероятно, можете сделать что-то вроде этого:
class SolitaireGame:
{
public:
SolitaireGame( int numsuits = 1 );
private:
vector<Card> _shoe;
Deck _deck;
};
SolitaireGame::SolitaireGame( int numsuits )
: _shoe(NUM_CARDS_IN_SHOE)
, _deck(_shoe)
{
}
Я изменил _deck
с указателя. Я использую тот факт, что переменные-члены создаются в порядке, объявленном в определении класса, поэтому _shoe
будет полностью создан, прежде чем он будет передан в качестве ссылки на конструктор для _deck
. Преимущество этого состоит в том, что я избавил от необходимости динамически выделять _deck
. Без использования new
я знаю, что не могу пропустить звонки на delete
, так как ничего не нужно явно освобождать.
Вы правы, что вы можете хранить указатели на Card
в _shoe
в вашем _deck
без каких-либо проблем с управлением памятью, но учтите, что вы не должны добавлять или удалять любые из Card
в _shoe
в течение жизни игры, иначе вы лишите законной силы все указатели в _deck
.