【发布时间】:2010-04-04 16:40:04
【问题描述】:
我有一个班级模型:
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;
};
【问题讨论】:
-
应该可以。您遇到了什么错误,或者您如何知道正在制作副本。
-
@Space_C0wb0y - 我知道它是一个副本,因为我修改了
_stack[0](它基本上是Card对象的容器),方法是从中拉出Card对象。然后我对它们都进行了查询 -_stack[0]的大小按预期减小了,但_deck的大小仍然与拉取之前的大小相同。 -
您是否尝试过将两个
shared_ptr设为同一类型?你能展示你做了什么修改吗?另外,尝试实现一个复制构造函数,看看它是否被调用(它不应该)。你能显示Deck和CardStack类吗? -
什么是
DECK?你确定_stack[DECK]和_deck指的是同一个对象吗?您最初说_stack[0]和_deck是相同的,但现在您有了一个新变量。 -
@Dennis Zickefoose - 是的。抱歉,为了方便,我使用了 0。代码实际上使用了调用
_stack[DECK] = _deck;,其中DECK在枚举中定义为0。它在Model构造函数期间执行此分配。我还没有打印出这两个指针的地址,但是我没有看到_stack[DECK]或_deck的任何其他分配。
标签: c++ boost shared-ptr