【问题标题】:Default constructor for struct with Long and pointer带有 Long 和指针的结构的默认构造函数
【发布时间】:2013-08-20 16:41:49
【问题描述】:

我正在学习c++。 我有一个这样的结构:

struct Info {

const Long rate;
A* ptr;

}

我有一个构造函数,它将所有参数作为其参数来初始化结构。但是,这个结构是另一个类的一部分,它将使用 boost 序列化进行序列化。为了序列化该类,我需要该结构的默认构造函数。但是,当我尝试编写默认构造函数时,例如

Info () {
}

我收到一个错误 C2758,表示应在构造函数中初始化成员费率。 如何为这样的结构获取默认构造函数,我可以用它来序列化我的类。

【问题讨论】:

  • 你错过了一个;在你的结构声明之后。您还应该将构造函数(声明)放在结构中。你能提供一个更好的例子来说明什么不起作用吗?
  • Long 是用户定义的类型吗?
  • 你也能展示一下你的 Long 类吗?
  • const 成员通常不是一个好主意。他们带来的问题往往多于解决的问题(提醒我,他们到底解决了什么问题?)

标签: c++ default-constructor


【解决方案1】:

你需要初始化常量值,所以:

Info () : rate(0) {
}

【讨论】:

    【解决方案2】:

    该错误可能是由于您的Long 类也没有默认构造函数。

    有两种方法可以解决这个问题:

    • 将默认构造函数添加到Long,或者
    • rate添加到Info的构造函数的初始化列表中。

    【讨论】:

    • 在这种情况下编译器会给出错误 C2512。 Long 可能只是一个内置类型的 typedef
    【解决方案3】:

    您可以查看C2758 的 msdn 文档以获取错误说明。

    在基本术语中,必须在所有构造函数中初始化 const 变量。编译器强制在构造对象时必须初始化任何内置类型或 const 指针成员,因为在构造后您将没有机会给它一个有意义的值(如果您可以在创建后更改它,它是怎么回事?)。

    此外,作为一般经验法则,在所有类构造函数中将没有默认构造函数(内置类型、指针和没有默认构造函数的对象)的成员初始化为某些东西总是一个好主意.否则它们要么被初始化为一些随机值(原语或指针),要么你会得到一个编译错误(没有默认构造函数的对象)。

    Info()
     : rate(0)
     , ptr(nullptr)
    {
    }
    

    如果您从构造函数参数中为某些参数赋值,请不要忘记也为其他成员赋值。

    Info( Long rate)
     : rate( rate )
     , ptr(nullptr)
    {
    }
    

    【讨论】:

      【解决方案4】:

      试试这个:

         struct Info {
            const Long rate;
            A* ptr;
            Info():rate(0){} // as Matthew guessed, call the correct Long constructor
                             // or define a default constructor for Long
      
         };
      

      【讨论】:

      • @Dukeling 如果Long 是默认的可构造用户定义类型,它会起作用。
      • 是的,我刚刚意识到“long”就是“Long”
      • @juanchopanza 可能,但如果没有Info(){} 也不行吗?
      • @Dukeling 是的,没错。除了 OP 似乎有某种没有在类中声明的构造函数,所以很难弄清楚真正的问题是什么。
      猜你喜欢
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多