dbl*_*esk 2 c++ wrapper shared-ptr
出于教育目的,我今天早些时候实现了一个包装类,定义如下(这取自一本书):
#ifndef WRAPPER_H
#define WRAPPER_H
template<class T>
class Wrapper
{
public:
Wrapper()
{ dataPtr = 0; }
Wrapper(const T& inner)
{
dataPtr = inner.clone();
}
Wrapper(const Wrapper<T> &original)
{
if (original.dataPtr != 0)
dataPtr = original.dataPtr->clone();
else
dataPtr = 0;
}
Wrapper &operator =(const Wrapper<T> &original)
{
if (this != &original)
{
if (dataPtr != 0)
delete dataPtr;
dataPtr = (original.dataPtr !=0) ? original.dataPtr->clone() : 0;
}
return *this;
}
~Wrapper()
{
if (dataPtr != 0)
delete dataPtr;
}
T &operator*()
{
return *dataPtr;
}
const T&operator*() const
{
return *dataPtr;
}
T *operator->()
{
return dataPtr;
}
const T * const operator->() const
{
return dataPtr;
}
private:
T *dataPtr;
};
#endif
Run Code Online (Sandbox Code Playgroud)
主要思想是充当指针,具有处理内存管理,复制构造函数,析构函数和赋值运算符的额外优势.它包装了具有克隆方法的类:它们返回一个指向自身副本的指针(不是自己的指针,而是一个新的副本new Class(*this)).
在某些方面它似乎像a unique_ptr,因为包装的对象只能通过这个包装器访问.但是,有一点不同,这就是我的问题所在.在这个包装类中,有一个构造函数,它通过接受对它包装的类的对象的引用(上面代码中的第一个构造函数)来定义.
这很方便.比方说,我们有类A和B,以及构造B需要一个参照Wrapper< A >.然后我可以B用另一个对象构造一个对象A:
A object1;
B object2(A);
Run Code Online (Sandbox Code Playgroud)
这是因为object2用于使用上述构造函数构造Wrapper< A >(然后传递给构造函数B)Wrapper.
是否可以使用任何智能指针执行此操作std::memory?我的主要目标是教育,但在实践中我不想重新发明轮子.
甲智能指针的目的是提供所有权语义,其可以被分类(并且与可用的C++标准实现):
这与你的包装器实现完全不同.