C ++如何使用未初始化的智能指针

时间:2014-11-06 16:29:15

标签: c++ smart-pointers

我不是C ++的专家,我需要将一个单元化的智能指针声明到我的类中,并在从超类继承的方法中使用它,我无法修改源代码,因为它是预编译库的一部分。

情况就是这样:

class myClass: public xNS::aClass
{
   private:
      xClass& mysmp;

   public:
      myClass();
      virtual ~myClass();

      /* method inherited */
      void foo(bClass& xsmp);
}

这就是我想在方法foo中做的事情:

void myClass::foo(bClass& xsmp)
{
   mysmp = xsmp;
}

我尝试使用成员初始值设定项列表解决:

myClass()::myClass() : mysmp(NULL)
{
   /* ... */
}

但我理解这是不可能的,因为编译器返回错误.. 我怎样才能解决我的问题?

如果有帮助,我正在使用g ++。

提前感谢您的建议。

2 个答案:

答案 0 :(得分:2)

您需要一个值为引用的变量。幸运的是reference_wrapper正是出于这个目的。

答案 1 :(得分:2)

首先,让我们明白一些事情:

xClass&安培; mysmp不是一个指针。就此而言,它甚至不是一个智能指针。变量声明中的类型之后的&符号(&)表示它是引用

xClass&安培;表示mysmp 必须 引用到现有的 xClass实例。它可能不会引用NULL。它也不能指任何东西;它必须用要引用的东西初始化。此外,在已经分配引用后,不能更改引用以引用其他实例。

话虽如此,如果你仍然希望使用引用,你可以在构造函数初始化列表中初始化它,如下所示:

myClass::myClass(xClass& xsmp) : mysmp(xsmp)
{
   /* ... */
}

如果在您的设计中mysmp可能为null是有意义的,您可以使用原始或(最好)智能指针,例如 std :: unique_ptr

// ...
std::unique_ptr<xClass> mysmp;
// ...

默认情况下,unique_ptr被初始化为指向空(nullptr),因此不需要在myClass构造函数中将其显式设置为空值。