Класс Qsharedpointer
Я пытаюсь использовать класс смарт-указатель следующим образом
class A
{
friend class B;
virtual methods ();
protected:
virtual ~classA();
}
class B:public QSharedPointer<class A>
{
class B();
~ class B();
}
Я планирую заменить вхождения класса A* на класс B. Является ли этот подход правильным?
1 ответ
Нет, это не совсем так. Похоже, что ваша цель дизайна в том, чтобы сделать невозможным выделение объекта типа A без умного указателя. Обычный способ сделать это - не наследовать от умного указателя, а сделать так, чтобы ваш тип имел
- Частный конструктор
- Частный деструктор
- Открытый статический метод фабрики, возвращающий в этом случае QSharedPointer
- Частный класс удаления, который является другом класса 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;
}