【问题标题】:Class-in-class object constructor/initialization fails类中对象构造函数/初始化失败
【发布时间】:2012-05-17 16:42:59
【问题描述】:

我对 C++ 术语很陌生,所以希望我的标题不会太离谱。但我 100% 确定有人会告诉我 ;)

我有这段代码:

struct B {
  struct A {
    A() : a(0) { }
    A(int a) { this->a = a; }
    int a;
  }
    a0,    // OK
    a1(1); // NOT OK!

  B() : b(0) { }
  B(int b) { this->b = b; }
  int b;
}
  b0,    // OK
  b1(1); // OK

但是 gcc 编译失败并生成这个输出:

8:8: error: expected identifier before numeric constant
8:8: error: expected ‘,’ or ‘...’ before numeric constant
2:3: error: new types may not be defined in a return type
2:3: note: (perhaps a semicolon is missing after the definition of ‘B::A’)

如果我删除 'a1(1)' 对象或将其更改为 'a1' 则它编译没有问题。但是我不能使用'A(int a)'构造函数。类似的?对象“b1”的构造函数没有问题。对此有何解释?谢谢:)

【问题讨论】:

    标签: c++ object constructor


    【解决方案1】:

    不允许在类/结构定义中初始化成员变量(例外:static const 积分(例如intshortbool)成员)

    对于b0b1,您声明(和初始化)两个全局变量,而不是成员变量

    【讨论】:

    • 静态 const integral 类型除外(C++11 之前)
    • Attila and co - thx :) @juanchopanza - 所以你说这段代码在 C++11 中实际上是有效的?我实际上确实使用 -std=c++0x 进行了编译:S
    • @Jens:你使用的是什么版本的 GCC? This page 指出支持仅存在于 GCC 4.7+ 中。
    • @JensSchwarzer 有效的 c++11,但 gcc 仅支持 ildjarn 所说的 4.7。
    • @juanchopanza 刚刚安装了 4.7.0 版并进行了尝试 - 但报告了相同的错误(使用 -std=c++11)。有什么线索吗?谢谢 :)
    【解决方案2】:

    您的对象和实例不匹配。 类 B 的定义中不能有预先构造的对象(A 的实例),除非它是静态 const,但您仍然无法在类声明中对其进行初始化。

    【讨论】:

      【解决方案3】:

      a0a1 是外部结构的成员,就像普通属性一样,您不能内联初始化它们。您需要在 B 构造函数初始化器列表中初始化 a0a1

      【讨论】:

        【解决方案4】:

        如果您要求正确的语法..,

        struct B {
            struct A {
                int a;
        
                A()      : a(0) { }
                A(int a) : a(a) { }
            } a0, a1;
        
            int b;
        
            B()      : a0(), a1(1), b(0) { }
            B(int b) : a0(), a1(1), b(b) { }
        } b0, b1(1);
        

        【讨论】:

        • 非常感谢 - 但究竟什么时候调用构造函数?我的意思是如果 A0/a1 没有在 B 的构造函数中初始化,那么 A 中的构造函数没有被使用吗?
        • @Jens : a0a1 B 的构造函数中初始化 -- B() : a0(), a1(1), b(0) { }B(int b) : a0(), a1(1), b(b) { }。也许您不熟悉constructor initialization lists 的语法?
        • 我的意思是如果我将 B 的构造函数简化为只初始化 'b' 而不是 'a0' 和 'a1' 那么我们仍然会有 'a0' 和 'a1' 作为实例,对吗?但是他们的构造函数会被调用吗?
        • @Jens : 是的,A 有一个非平凡的默认构造函数,因此如果您从 B 的构造函数初始化列表中省略 a0a1,它将自动调用。如果 A 是 POD 类型,它将完全保持未初始化状态。
        猜你喜欢
        • 2021-11-06
        • 2013-12-30
        • 2014-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-05
        • 2021-09-10
        相关资源
        最近更新 更多