我应该使用const引用还是boost :: shared_ptr?

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)

};

Fer*_*yer 5

原因是存储在向量中的对象可以移动其地址,因此将地址存储在任何地方都是禁忌.

存储(const)引用与存储指针一样糟糕,原因相同.如果只要其他对象保持指向其中对象的指针,向量的大小不会改变,那么您应该是安全的.

在用C++编程时,你应该总是决定谁"拥有"一个对象,例如谁不负责在不再需要时删除它.如果没有自然对象所有者,您可以boost::shared_ptr使用类似智能指针,使用引用计数或垃圾回收来管理对象的生命周期.

在您的情况下,很明显该SolitaryGame实例拥有所有卡.而且,游戏中的牌数是固定的.因此,您可以轻松地将卡片的指针传递给依赖于游戏实例的对象.

删除游戏后,所有卡都将被删除,剩余的指针将无效,但此时,其他持有卡指针的对象也会被删除.

  • 我完全赞同这个(+1).我唯一要补充的是,我将这些卡作为(const)引用传递(然后将它们作为指针存储在CardStack中).我的策略是将函数参数和返回值作为指针,当且仅当NULL是有效值时,否则使用引用.这节省了在使用之前检查/断言卡有效的需要,并且使程序员明白NULL不是有效的. (2认同)