0

2 つのクラスを考える

class A{
public:
    int i;
    A(){}
    explicit A(const int ii):i(ii){}
    virtual ~A(){
        cout<<"~A - "<< i <<endl;
    }
    virtual void inc(){
        i++;
        cout<<"i: "<<i<<endl;
    }
};

class B: public A{
public:
    int j;
    B(){}
    explicit B(const int jj, const int ii=-1):A(ii), j(jj){}
    ~B(){
        cout<<"~B - "<<i<<", "<<j<<endl;
    }
    void inc(){
        A::inc();
        j++;
        cout<<"j: "<<j<<endl;
    }
};

main()これで、次のように実行できます。

A *pa = new B();
//...
pa->inc(); // implements B::inc();

boostライブラリを使用したバージョン

boost::shared_ptr<A> pa = boost::make_shared<B>(2);
//...
pa->inc(); // implements B::inc();

バージョンを使用する際の私の質問は、boostこの方法で使用しても問題ないかどうか、つまり、両方のバージョンを同じ方法で使用できるかどうか、または何か特別なことをする必要があるかどうかです (ブーストの内部についてはあまり知りません)。

4

1 に答える 1

6

スマート ポインターではできないことがいくつかあります。

  • 通常のポインターを期待する関数に引数としてスマート ポインターを渡すことはできません。
  • 通常のポインターをスマート ポインターに割り当てることはできません。

それ以外は、仮想関数の呼び出しを含め、スマートポインターを他のポインターとして処理でき、正しいことが起こります。

PS。可能であれば、代わりに C++11 スマート ポインターに移行することをお勧めします。それらは Boost スマート ポインタに「触発された」(つまり、多かれ少なかれそのままコピーされた) ため、実際に行う必要があるのは、<memory>ヘッダー ファイルをインクルードして、たとえばboost::shared_ptrに変更することだけstd::shared_ptrです。たとえば、この参照サイトを参照してください。

于 2012-09-10T11:18:06.177 に答える