【问题标题】:Initialization of a struct instance data member in constructor?在构造函数中初始化结构实例数据成员?
【发布时间】:2011-06-02 14:19:06
【问题描述】:

我有一个 c++ 类,它作为私有数据成员定义了一个结构:

Class example {

...

private:
   struct Impl;
   Impl& structure_;
};

假设struct Impl定义如下:

struct example::Impl{
    int m1;
    int m2;
    int m3;
};

如何在类的构造函数中初始化结构实例(结构_)?

现在我有:

example::example() :
     structure_ .m1(00),
     structure_ .m2(00),
     structure_ .m3(00) {
...
}

.. 对于初始化列表,但我收到此错误:

'example::structure_' : 必须在构造函数基/成员初始化列表中初始化

我该如何解决这个问题?

谢谢

【问题讨论】:

    标签: c++ class struct initialization


    【解决方案1】:

    Impl 是一个引用,所以你需要用一个实际的 Impl 对象来初始化它,然后才能使用它。

    【讨论】:

      【解决方案2】:

      如果您要使用 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_; }
      

      【讨论】:

      • 这仍然不是一个有效的 ctor-initializer
      • 这里的旁注:我通常会尝试建议在隐藏实现的结构内使用正确大小的缓冲区来实现 pimpl-idiom。这样,每次尝试在实例上调用某些东西时,您都不必进行额外的 l2-cache-miss/memory 提取。 +1 以获得良好的一般 pimpl-idiom 描述!
      • @Simon:这会产生问题,因为有时您无法确定对齐方式。或者你怎么知道大小?
      • 是的,这确实是问题所在。枚举 { IMPL_SIZE = 123; };联合 { char implbuf [IMPL_SIZE];双重对齐; } 实施; .. 根据双重类型将其与非常严格的对齐方式对齐,可以根据您的需要进行更改。确保在构造中有一个断言或静态断言,以确保您的 sizeof(impl) 等于或小于 IMPL_SIZE 以避免错误。
      【解决方案3】:

      由于你的结构_是一个引用,它需要被在你的“示例”类之外创建的东西引用。您可以将引用更改为指针并以某种方式分配结构,或者在类定义中定义结构,允许您直接实例化它而不是使用引用。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-26
          相关资源
          最近更新 更多