Bee*_*and 2 c++ pointers vector
我是一个相对较新的C++编程,但我是一个10年的C程序员,因此对指向对象的指针比对对象的引用更为舒服.
我正在写一个纸牌游戏 - 这个设计不安全吗?有没有更好的办法?
无论如何,我有一节课SolitaireGame
:
class SolitaireGame:
{
public:
SolitaireGame( int numsuits = 1 );
private:
Deck * _deck;
vector<Card> _shoe;
};
Run Code Online (Sandbox Code Playgroud)
在Deck
被这样定义:
class Deck:
{
public:
Deck::Deck( vector<Card>& shoe );
~Deck();
int DealsLeft() const { return deals_left; }
Card * PullCard();
private:
int deals_left;
int num_each_deal;
deque<Card *> _cards;
};
Run Code Online (Sandbox Code Playgroud)
的Deck
构造,花费的向量的参考Card
对象(鞋,通常104卡)并按下指针到每个卡到它自己的指针的双端队列.
Deck::Deck( vector<Card>& shoe )
{
vector<Card>::iterator iter = shoe.begin();
while( iter != shoe.end() )
{
_cards.push_front( &(*iter) );
iter++;
}
}
Run Code Online (Sandbox Code Playgroud)
}
鞋子是在SolitaireGame
构造函数中创建的.一旦创建了动态创建的Card
对象的向量- 然后我将对该向量的引用传递给构造函数.
SolitaireGame::SolitaireGame( int numsuits ):_numsuits(numsuits )
{
Card * c;
vector<Card> _shoe;
for( int i = 0; i < NUM_CARDS_IN_SHOE; i++ )
{
c = new Card();
_shoe.push_back( *c );
}
_deck = new Deck( _shoe );
}
Run Code Online (Sandbox Code Playgroud)
我的想法是,鞋子将成为Card
对象的实际内存的容器,Deck
并且Columns
只处理指向这些Card
对象的指针.
CB *_*ley 15
只需使用这段代码,就可以泄漏动态创建的卡片.
Card * c;
vector<Card> _shoe;
for( int i = 0; i < NUM_CARDS_IN_SHOE; i++ )
{
c = new Card();
_shoe.push_back( *c );
}
Run Code Online (Sandbox Code Playgroud)
_shoe.push_back( *c )
将指向的对象的副本添加到s 的向量中.然后,您无法删除之前在该行中创建的原始文件.Card
c
Card
Card
分配矢量NUM_CARDS_IN_SHOE
Cards
可以更简单地实现如下:
std::vector<Card> _shoe( NUM_CARDS_IN_SHOE );
Run Code Online (Sandbox Code Playgroud)
看看你的卡结构,看起来你有(或几乎拥有)对象之间的严格所有权,所以我认为你不需要动态创建你Card
的.
请注意,您的局部变量_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)
{
}
Run Code Online (Sandbox Code Playgroud)
我已经变成_deck
了指针.我使用的事实是成员变量是按照类定义中声明的顺序构造的,因此在_shoe
将其作为对构造函数的引用传递之前将完全构造_deck
.这样做的好处是我已经消除了动态分配的需要_deck
.没有使用new
,我知道我不能有任何未接来电,delete
因为没有必要明确地解除分配.
你是对的,你可以在没有任何内存管理问题的情况下存储指向Card
s in的指针,但请注意,你不能在游戏的生命周期中添加或删除任何s,否则你将使所有的指针无效._shoe
_deck
Card
_shoe
_deck