我不是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的存在正是为了这个目的。