4

私はクラスモデルを持っています:

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;
}

の割り当て_deck_stack[0]、コピーが作成される結果になるよう_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;
}

私はこの出力を取得します(ここで、aのstd :: coutCardStackはそのスタックのサイズを出力します):

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;
};
4

4 に答える 4

2

あなたが何について尋ねているのか明確ではありません-このコードを検討してください:

#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;
}

コピーが作成されていないことを示す「破棄」メッセージが1つだけ表示されます。

于 2010-04-04T16:58:08.130 に答える
1

問題は、ここで異なるタイプ間で割り当てていることだと思います。boost::shared_ptrはテンプレートであり、テンプレートのタイプが多形であっても、テンプレートは多形ではありません。つまり、コンパイラはからboost::shared_ptr<Deck>への割り当てboost::shared_ptr<CardStack>を確認し、CardStackのコピーコンストラクタを呼び出してDeckオブジェクトを複製することで割り当てを行うことができることに気付きます。

割り当てをどのように見せたいかは、次のようになります。

_stack[0] = boost::static_pointer_cast<CardStack>(_deck);

これにより、期待どおりに変換が行われます。

于 2010-04-04T17:23:12.027 に答える
1

この例-@Neilの答えから派生し、あなたが言っていることが起こっていることをエミュレートしようとします。システムで期待どおりに機能することを確認できますか(AとBのカウントは同じです)。

次に、このコードまたはコードを一致するまで変更してみます。

#include <boost/shared_ptr.hpp>
#include <iostream>

class A {
    public:
    virtual ~A()
    {
        std::cerr << "Delete A" << std::endl;
    }
    int _count;
    void decrement()
    {
        _count --;
    }
};
class B : public A {
    public:
    virtual ~B()
    {
        std::cerr << "Delete B" << std::endl;
    }
};

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

    a->decrement();

    std::cerr << "A:" << a->_count << std::endl;
    std::cerr << "B:" << b->_count << std::endl;
    return 0;
}

編集:

コメントから、元のポインタが正しいことがわかったので、トレースする必要があります。

また:

  1. ポインタをログに記録して、いつ変更されるかを確認します。
  2. デバッガーでウォッチポイントを使用して、ポインターがいつ変更されるかを確認します。
  3. 3番目の共有ポインターを使用して、変更されたポインターを確認します。
  4. 両方のポインタを同時に変更する関数を導入します。
于 2010-04-04T18:10:31.653 に答える
1

私はあなたがしたいかもしれないと思いshared_arrayます_stack 。。。shared_ptr; boost.orgのドキュメントをご覧ください。具体的には、次のとおりです。

http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/shared_ptr.htm

「通常、shared_ptrは、動的に割り当てられた配列へのポインターを正しく保持できません。その使用法については、shared_arrayを参照してください。」

また、T* get()管理対象ポインター(この場合はshared_ptr)によって保持されている生のポインターを返す関数(正当な理由なしに使用しないでください)に注意してください。

于 2010-04-04T18:43:49.763 に答える