首先,我了解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构造函数签名中看到它会更好。
答案 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)
{
// ...
}
与指南中的技术类似,这实际上并不强制执行任何操作。它确实注释了代码,使所有权的代理更清晰。