我已经创建了一些C++类来模拟纸牌游戏作为学习练习。我应该使用const引用还是boost :: shared_ptr?
我有SolitaireGame,CardStack(板上10堆卡中的一个)和一张卡片的课程。我目前的模型指出,SolitaireGame拥有104个卡片对象 - 我称之为“鞋子”。 SolitaireGame还记录了10个CardStacks,它们基本上是存储在鞋中的Card对象地址的deque。甲板和手从CardStack继承。我通过指向储存在鞋中的原始物体的指针将卡片从卡座传递到级联。
根据我收到的this问题的回答数量,我不应该通过指针传递卡片,而应该使用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;
};
感谢您的答复Ferdindand。是的,这是我设想它的工作原理,一个游戏被删除,卡被删除,但它确定,因为所有的Cascades也被删除。我认为我的代码是相当安全的,因为卡片不是动态分配的,并且鞋子总是包含104张不变的卡片。 – BeeBand 2009-11-11 14:40:23
我完全同意这个(+1)。我会补充的唯一的事情是,我将卡片作为(const)引用传递(然后将它们作为指针存储在CardStack中)。我的政策是函数参数和返回值是指针当且仅当NULL是一个有效值,否则使用引用。这可以避免在使用卡之前检查/断言卡的有效性,并使程序员清楚NULL是否无效。 – 2009-11-11 14:44:23