私は次のようにスマートポインタクラスを使おうとしています
class A
{
friend class B;
virtual methods ();
protected:
virtual ~classA();
}
class B:public QSharedPointer<class A>
{
class B();
~ class B();
}
クラスA*のオカレンスをクラスBに置き換える予定です。このアプローチは正しいですか?
私は次のようにスマートポインタクラスを使おうとしています
class A
{
friend class B;
virtual methods ();
protected:
virtual ~classA();
}
class B:public QSharedPointer<class A>
{
class B();
~ class B();
}
クラスA*のオカレンスをクラスBに置き換える予定です。このアプローチは正しいですか?
いいえ、これは実際にはこれを行う方法ではありません。ここでの設計目標は、誰かが型 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;
}