在构造函数中初始化struct实例数据成员?

时间:2011-06-02 14:19:06

标签: c++ class struct initialization

我有一个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

中初始化

我该如何解决这个问题?

由于

4 个答案:

答案 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)

您可以通过引用在您的类中存储您的结构。引用必须指向物理对象,您可以做两件事。按值或按指针存储对象。