Bee*_*and 0 c++ boost reference
我创建了一些C++类来模拟Solitaire游戏作为学习练习.
我有SolitaireGame的课程,CardStack(板上10堆卡片之一)和一张卡片.我现在的模型说SolitaireGame拥有一个104卡对象的矢量 - 我称之为'鞋'.SolitaireGame还跟踪10张CardStack,它们基本上是存储在鞋子中的Card对象地址的deque.Deck和Hand继承自CardStack.我通过指向存储在Shoe中的原始对象的指针将牌从Deck传递到Hand to Cascade.
根据我收到的这个问题的一些答案,我不应该通过指针传递卡片,但应该使用const引用.原因是存储在向量中的对象可以移动其地址,因此将地址存储在任何地方都是禁忌.我最近开始关注boost :: sharedptr.人们如何看待在这里使用shared_ptr卡?
以下是类的简化版本:
class SolitaireGame
{
public:
SolitaireGame::SolitaireGame( int numsuits );
private:
vector<Card> _shoe;
Deck _deck;
Hand _hand;
CardStack _cols[NUM_COLUMNS];
int _numsuits;
GameState gamestate;
};
class CardStack
{
public:
CardStack(){ cout << "CardStack constructor" << endl; }
CardStack( const CardStack& );
CardStack( const deque<Card *> &d );
~CardStack(){ }
virtual Card * PullCard( Face f );
virtual void PushCard( Card * c );
Card * CardAt( int i ) const;
Card * Top() const;
deque<Card *>::iterator Begin() { return _cards.begin(); }
deque<Card *>::iterator End() { return _cards.end(); }
int Size() const;
CardStack& operator=( const CardStack& rhs );
friend std::ostream& operator<<(std::ostream &os, const CardStack &obj);
private:
deque<Card *> _cards;
Run Code Online (Sandbox Code Playgroud)
};
原因是存储在向量中的对象可以移动其地址,因此将地址存储在任何地方都是禁忌.
存储(const)引用与存储指针一样糟糕,原因相同.如果只要其他对象保持指向其中对象的指针,向量的大小不会改变,那么您应该是安全的.
在用C++编程时,你应该总是决定谁"拥有"一个对象,例如谁不负责在不再需要时删除它.如果没有自然对象所有者,您可以boost::shared_ptr使用类似智能指针,使用引用计数或垃圾回收来管理对象的生命周期.
在您的情况下,很明显该SolitaryGame实例拥有所有卡.而且,游戏中的牌数是固定的.因此,您可以轻松地将卡片的指针传递给依赖于游戏实例的对象.
删除游戏后,所有卡都将被删除,剩余的指针将无效,但此时,其他持有卡指针的对象也会被删除.