简单的包装类与智能指针

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,因为包装的对象只能通过这个包装器访问.但是,有一点不同,这就是我的问题所在.在这个包装类中,有一个构造函数,它通过接受对它包装的类的对象的引用(上面代码中的第一个构造函数)来定义.

这很方便.比方说,我们有类AB,以及构造B需要一个参照Wrapper< A >.然后我可以B用另一个对象构造一个对象A:

A object1;
B object2(A);
Run Code Online (Sandbox Code Playgroud)

这是因为object2用于使用上述构造函数构造Wrapper< A >(然后传递给构造函数B)Wrapper.

是否可以使用任何智能指针执行此操作std::memory?我的主要目标是教育,但在实践中我不想重新发明轮子.

πάν*_*ῥεῖ 5

智能指针的目的是提供所有权语义,其可以被分类(并且与可用的C++标准实现):

  • 独特的所有权总是在传递时被转移
  • 共享没有单个所有者,智能指针计数引用,并且如果它们降至0则死亡
  • weak一个依赖指针,但提供检查引用指针是否仍然有效的能力

这与你的包装器实现完全不同.