c++ - 为什么这些 shared_ptr 不指向同一个容器?

标签 c++ boost shared-ptr

我有一个类模型:

class Model
{
    ...

    boost::shared_ptr<Deck>  _deck;
    boost::shared_ptr<CardStack> _stack[22];
};

Deck 继承自 CardStack

我试图让 _stack[0] 指向与 _deck 指向相同的东西:

{
    _deck = boost::shared_ptr<Deck>(new Deck());
    _stack[0] = _deck;
}

似乎对 _stack[0]_deck 的赋值导致生成了 _deck 的拷贝。 (我知道这一点是因为对 _stack[0] 的修改不会导致对 _deck 的修改。)如何让它们指向同一事物?

好的 - 没有调用复制构造函数。我已经通过实现它并查看它是否被调用来验证这一点 - 它没有。

但是 - 我有一个对 CardStack 对象进行操作的函数:

void TransferSingleCard(CardStack & src, CardStack & dst, Face f)
{
    if( !src._cards.empty() )
    {
        src._cards.back().SetFace(f);
        dst.PushCard(src._cards.back());
        src._cards.pop_back();
    }   

}

现在 - 当我打电话时:

{
    TransferSingleCard(*_stack[DECK], _someotherplace, FACEDOWN);
    std::cout << *_stack[DECK];
    std::cout << *_deck;
}

我得到这个输出(其中 CardStack 上的 std::cout 将打印出该堆栈的大小):

Num(103) TOP
Num(104) TOP

...所以我得出结论(错误?)_stack[DECK] 指向不同的东西。

甲板

class Deck : public CardStack
{
public:
    Deck(int numsuits=2, StackIndex index = NO_SUCH_STACK );
    Deck::Deck( const Deck & d);
    int DealsLeft() const;
    void RecalcDealsLeft();
private:
    int _dealsleft;
};

最佳答案

不清楚你在问什么 - 考虑这段代码:

#include <iostream>
#include "boost/shared_ptr.hpp"
using namespace std;

struct A {
    virtual ~A() {
        cout << "destroyed" << endl;
    }
};

struct B : public A {
};

int main() {
    boost::shared_ptr<B> b( new B );
    boost::shared_ptr<A> a;
    a = b;
}

只出现一条“destroy”信息,表示没有复制。

关于c++ - 为什么这些 shared_ptr 不指向同一个容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2575095/

相关文章:

c++ - std::bind 中的 shared_from_this 如何在对象不存在的情况下工作?

c++ - QMap::contains() 未返回预期值

c++ - Eclipse CDT 对比 NetBeans C++ 对比

c++ - Qt: QListView 改变 MultiSelection 选择模式的行为

c++ - CLion 中 CMake 的引用 boost

c++ - 使用 Phoenix Bind 绑定(bind) boost 信号

c++ - Boost asio 自定义 HTTP 服务器读取 HTTP post 请求

c++ - make_shared() 的可调试替代品

c++ - 如何在父类和子类中使用std::enable_shared_from_this?

c++ - 一方面背景是透明的,另一方面是上部窗口的标签