【问题标题】:Initialize first entries of an array of objects in class constructor initialization list在类构造函数初始化列表中初始化对象数组的第一个条目
【发布时间】:2019-11-21 13:49:31
【问题描述】:

如果我有一个声明 Class B 并实例化它的数组的类 A。

class A{
    class B{
        int x, y;
    };
    B arrB[10];

 public:
    A();
};

然后,我的问题是我想使用初始化列表来初始化 A 类中“arrB”的前两个对象:

A::A(): arrB[0](1, 2), arrB[1](3, 4) {}

但是编译器不接受。

我可以初始化数组的特定对象吗?如果是,怎么做?

谢谢

【问题讨论】:

  • 你有理由在初始化列表中而不是在构造函数体中需要这个吗?
  • 可能类似于:arrB{{1,2},{3,4},{},{},{},{},{},{},{},{}}arrB{{1,2},{3,4}} 但是其余元素获取随机值并且它必须是结构或公共 x,y
  • @KIIV:第二种形式很好;其余元素将被初始化为零
  • 编译器抱怨第二种形式,因为它在询问其余数组项的初始化时出错
  • 在有问题的编辑之后它将不起作用。它适用于struct { int x, y; };

标签: c++ constructor initializer


【解决方案1】:

问题在于B 默认隐藏其成员为private,因为它是class。声明 B 结构,或将 int x, y 公开为 public 以便能够使用聚合初始化:

class A{
    class B{
        public:
        int x, y;
    };
    B arrB[10] = {{1,2}};

 public:
    A();
};

第二个问题是您没有正确使用聚合初始化。

A::A(): arrB[0](1, 2), arrB[1](3, 4) {}

应该是

A::A(): arrB{{1, 2}, {3, 4}} {}

Demo

【讨论】:

    【解决方案2】:

    为了在类成员初始化列表中初始化一个数组,您需要像在函数中初始化一个数组一样使用花括号。

    因此,如果你想初始化数组的第一个和第二个元素,你至少需要使用

    A() : arrB{{1,2}, {3,4}} {}
    

    如第一组 ({1,2}) 所说,将 xy 分别初始化为 12 使 arrB[0] 成为 B。第二组({3,4})表示将xy 分别初始化为34,使arrB[1] 成为B。

    您必须做一件事才能完成这项工作。您要么需要创建B 并通过将xy 公开来进行聚合,或者您可以为B 提供一个构造函数来获取值。这样做可以让您拥有任一

    class A{
        class B{
        public:
            int x, y;
        };
        B arrB[10];
    
     public:
        A() : arrB{{}, {3,4}} {}
    };
    
    int main() {
        A a;
    }
    

    class A{
        class B{
            int x, y;
        public:
            B() : x(), y() {} // need this so default instances are value initialized (zeroed in this case)
            B(int x, int y) : x(x), y(y) {}
        };
        B arrB[10];
    
     public:
        A() : arrB{{}, {3,4}} {}
    };
    
    int main() {
        A a;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 2021-11-06
      • 1970-01-01
      • 2021-09-10
      相关资源
      最近更新 更多