Класс Qsharedpointer - PullRequest
       41

Класс Qsharedpointer

0 голосов
/ 22 марта 2011

Я пытаюсь использовать класс интеллектуальных указателей следующим образом

class A 
{

 friend  class B;
virtual methods ();

protected:
virtual ~classA();

}

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

}

Я планирую заменить экземпляры класса A * на класс B. Правильно ли этот подход?

1 Ответ

3 голосов
/ 30 марта 2011

Нет, на самом деле это не способ сделать это.Похоже, что ваша цель в дизайне заключается в том, чтобы сделать невозможным выделение объекта типа A без умного указателя.Обычный способ сделать это - не наследовать от умного указателя, а сделать так, чтобы ваш тип имел

  1. Закрытый конструктор
  2. Закрытый деструктор
  3. Общедоступныйстатический метод фабрики, возвращаемый в этом случае QSharedPointer
  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;
}
...