2016-02-26 3 views
2

Во-первых, я знаю об уникальных_ptr и share_ptr, но Я не использую C++ 11, и поэтому я не могу их использовать.Как показать, что вы передали право собственности на указатель

Все возможные исследования от google возвращают решение с использованием этих двух интеллектуальных указателей. Я бы хотел одного.

Мне нужно передать право собственности на указатель на другой класс через конструктор.

PointerToPass* myPointer = new PointerToPass(); 
MyClass* myClass = new MyClass(myPointer); 

Так что я мог бы использовать необработанные указатели, но я читал везде, что я должен его избегать.

Использование ссылки не является вариантом.

я мог бы использовать смарт-указатель от Qt, чтобы показать, что я прохожу собственность как так:

QScopedPointer<PointerToPass> myPointer(new PointerToPass()); 
MyClass* myClass = new MyClass(myPointer.take()); 

Этот вариант ясно показывает, что указатель передается и что собственность отдается MyClass, даже если он по-прежнему с помощью необработанные указатели.

Есть ли лучший способ передать эту идею?

Было бы даже лучше, если бы это можно было увидеть в сигнатуре конструктора MyClass.

+0

Вы не должны использовать 'new' из копии' take'. 'take' сбрасывает область действия ptr в null. – chris

+0

Да, но в этой области я больше не использую myPointer. Он используется только в MyClass после его передачи. – dyesdyes

+0

Почему не 'новый MyClass (новый PointerToPass());'? Или, если это так, если тип указателя не принимает никаких аргументов, просто позвольте 'MyClass' ctor выделить его. –

ответ

2

А как насчет указателя четких указаний нельзя использовать снаружи?

class myClass { 
    public: myClass(PointerToPass*& p): _p(p) { 
     p = nullptr; 
    } 

    public: ~myClass() { 
     delete _p; 
    } 

    private: PointerToPass* _p; 
}; 

PointerToPass* myPointer = new PointerToPass(); 

MyClass* myClass = new MyClass(myPointer); 
std::cout << myPointer << "\n"; 
+0

Мне нравится этот ответ, он ясно показывает намерение. – dyesdyes

1

C++ Core Guidelines имеет некоторые советы по этому вопросу и предлагает вам использовать owner от Guideline Support Library (GSL), чтобы аннотировать исходные указатели.

template <class T> 
using owner = T; 

Это просто ЬурейеЕ из owner<T> в T. Он служит только как аннотация и будет работать для вашего аргумента конструктора. Если этот синтаксис не был C++ 11.

Вместо этого мы могли бы использовать подобную идею.

template<typename T> 
struct owner 
{ 
    typedef T pointer; 
}; 

MyClass(owner<PointerToPass*>::pointer p) 
{ 
    // ... 
} 

Как и в технике, изложенной в руководящих принципах, это фактически не навязывает ничего. Он комментирует код, чтобы сделать семантику собственности более четкой.

Смежные вопросы