我有一个c ++类,作为私有数据成员定义了一个结构:
Class example {
...
private:
struct Impl;
Impl& structure_;
};
假设struct Impl定义如下:
struct example::Impl{
int m1;
int m2;
int m3;
};
如何在类的构造函数中初始化struct实例(structure_)?
现在我有:
example::example() :
structure_ .m1(00),
structure_ .m2(00),
structure_ .m3(00) {
...
}
..对于初始化列表,但我收到此错误:
'example :: structure_':必须在构造函数base / member initializer list
中初始化
我该如何解决这个问题?
由于
答案 0 :(得分:1)
Impl是一个引用,因此您需要先使用实际的Impl对象对其进行初始化,然后才能使用它。
答案 1 :(得分:1)
如果您要使用pImpl习语,请使用指针,并在类中分配+解除分配,然后在ctor内分配。
Class example {
...
private:
struct Impl;
Impl* pimpl_
};
example::example() :
pimpl_(new Impl())
{
pimpl_->m1 = 00;
pimpl_->m2 = 00;
pimpl_->m3 = 00;
...
}
example::~example(){
delete pimpl_;
}
如果你真的想要一个引用,请从new
取消引用返回的指针,并在删除时重新获取它的地址:
example::example() : impl_(*new Impl(), ...
example::~example(){ delete &impl_; }
答案 2 :(得分:1)
由于您的structure_是引用,因此需要通过在“example”类之外创建的内容来引用它。您可以将引用更改为指针并以某种方式分配结构,或者在类定义中定义结构,允许您直接实例化而不是使用引用。
答案 3 :(得分:0)
您可以通过引用在您的类中存储您的结构。引用必须指向物理对象,您可以做两件事。按值或按指针存储对象。