C++如何使用统一的智能指针



我不是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++。

提前感谢您的建议。

首先,让我们清理一下:

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构造函数中将其显式设置为null值。

您需要一个值为引用的变量。幸运的是,reference_wrapper的存在正是为了这个目的。

相关内容

  • 没有找到相关文章

最新更新