0

私は次のようにスマートポインタクラスを使おうとしています

class A 
{

 friend  class B;
virtual methods ();

protected:
virtual ~classA();

}

class B:public QSharedPointer<class A>
{
  class B();
~ class B();

}

クラスA*のオカレンスをクラスBに置き換える予定です。このアプローチは正しいですか?

4

1 に答える 1

3

いいえ、これは実際にはこれを行う方法ではありません。ここでの設計目標は、誰かが型 A のオブジェクトをスマート ポインターに配置せずに割り当てることができないようにすることです。これを行う通常の方法は、スマート ポインターから継承するのではなく、型に

  1. プライベート コンストラクター
  2. プライベート デストラクタ
  3. この場合 QSharedPointer を返す public static factory メソッド
  4. クラスAの仲間であるプライベートデリータクラス

これは boost::shared_ptr を使用した例です (私は現在 QT をインストールしていませんが、boost::shared_ptr のすべてのインスタンスを QSharedPointer に置き換えるだけでよいはずです)。

#include <boost/shared_ptr.hpp>

class A {
private:
    A() {}
    ~A() {}


    struct deleter {
            void operator()(A* val) {delete val;}
    };
    friend class deleter;
public:
    static boost::shared_ptr<A> create() {
            return boost::shared_ptr<A>(new A(), A::deleter());
    }

};

int main()
{
    //A a1;                //compile error
    //A *a2 = new A();     //compile error
    boost::shared_ptr<A> a3 = A::create();

    return 0;
}
于 2011-03-30T02:21:07.593 に答える