C++:数组的构造函数初始化程序

Jas*_*n S 64 c++ constructor initializer

我有大脑痉挛...如何在C++中正确初始化一组对象?

非数组示例:

struct Foo { Foo(int x) { /* ... */  } };

struct Bar { 
     Foo foo;

     Bar() : foo(4) {}
};
Run Code Online (Sandbox Code Playgroud)

数组示例:

struct Foo { Foo(int x) { /* ... */  } };

struct Baz { 
     Foo foo[3];

     // ??? I know the following syntax is wrong, but what's correct?
     Baz() : foo[0](4), foo[1](5), foo[2](6) {}
};
Run Code Online (Sandbox Code Playgroud)

编辑:狂野和疯狂的解决方法的想法值得赞赏,但在我的情况下他们不会帮助我.我正在开发一个嵌入式处理器,其中std :: vector和其他STL结构不可用,显而易见的解决方法是创建一个默认构造函数并使用一个init()可以在构造时间之后调用的显式方法,这样我就不会根本不得不使用初始化器.(这是我被Java的final关键字+灵活性与构造函数所破坏的情况之一.)

APr*_*mer 52

没有办法.您需要一个数组成员的默认构造函数,然后调用它,之后,您可以在构造函数中进行任何初始化操作.

  • 不幸的是,你是对的.+1请注意,C++ 1x的统一初始化语法将允许您执行此操作. (8认同)

Bar*_*rry 34

只是为了更新C++ 11的这个问题,现在这既可以做也很自然:

struct Foo { Foo(int x) { /* ... */  } };

struct Baz { 
     Foo foo[3];

     Baz() : foo{{4}, {5}, {6}} { }
};
Run Code Online (Sandbox Code Playgroud)

这些括号也可以省略更简洁:

struct Baz { 
     Foo foo[3];

     Baz() : foo{4, 5, 6} { }
};
Run Code Online (Sandbox Code Playgroud)

这也很容易扩展到多维数组:

struct Baz {
    Foo foo[3][2];

    Baz() : foo{1, 2, 3, 4, 5, 6} { }
};
Run Code Online (Sandbox Code Playgroud)

  • 当`Foo`的构造函数被声明为显式时,是否有一种解决方法? (3认同)
  • @dshin同样的方式.大多数支持:`:foo {{{1},{2}},{{3},{4}},{{5},{6}}}`或更少支持`foo {{1,2} ,{3,4},{5,6}}`,或者至少支持`foo {1,2,3,4,5,6}. (2认同)

Mic*_*fik 16

现在,您无法使用数组成员的初始化列表.你很难坚持做到这一点.

class Baz {
    Foo foo[3];

    Baz() {
        foo[0] = Foo(4);
        foo[1] = Foo(5);
        foo[2] = Foo(6);
    }
};
Run Code Online (Sandbox Code Playgroud)

在C++ 0x中,您可以编写:

class Baz {
    Foo foo[3];

    Baz() : foo({4, 5, 6}) {}
};
Run Code Online (Sandbox Code Playgroud)


Unc*_*ens 7

不幸的是,没有办法初始化数组成员直到C++ 0x.

您可以在构造函数体中使用std :: vector和push_back Foo实例.

你可以给Foo一个默认的构造函数(可能是私有的,让Baz成为朋友).

您可以使用复制的数组对象(boost或std :: tr1)并从静态数组初始化:

#include <boost/array.hpp>

struct Baz {

    boost::array<Foo, 3> foo;
    static boost::array<Foo, 3> initFoo;
    Baz() : foo(initFoo)
    {

    }
};

boost::array<Foo, 3> Baz::initFoo = { 4, 5, 6 };
Run Code Online (Sandbox Code Playgroud)