如何显示您传递指针的所有权

时间:2016-02-26 03:40:57

标签: c++ qt c++03

首先,我了解unique_ptr和share_ptr,但是我没有使用C ++ 11 ,因此我无法使用它们。

谷歌的每项可能的研究都会使用这两个智能指针返回一个解决方案。我想要一个没有。

我需要通过构造函数将指针的所有权传递给另一个类。

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

所以我可以使用原始指针,但我到处读到我应该避免它。

使用引用不是一种选择。

我可以使用Qt的智能指针来表明我通过了所有权:

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

这个选项清楚地表明指针已经传递,并且即使它仍然使用原始指针,所有权也被赋予myClass。

有没有更好的方式来传达这个想法?

如果可以在MyClass构造函数签名中看到它会更好。

2 个答案:

答案 0 :(得分:3)

如果不在外面使用清除指示指针呢?

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";

答案 1 :(得分:1)

C++ Core Guidelines对此有一些建议,建议您使用Guideline Support Library(GSL)中的owner来注释原始指针。

template <class T>
using owner = T;

这只是owner<T>T的typedef。它仅用作注释,适用于构造函数参数。如果这种语法不是C ++ 11。

我们可以使用类似的想法。

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

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

与指南中的技术类似,这实际上并不强制执行任何操作。它确实注释了代码,使所有权的代理更清晰。