我不是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 ++。
提前感谢您的建议。
答案 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构造函数中将其显式设置为空值。