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
没有办法.您需要一个数组成员的默认构造函数,然后调用它,之后,您可以在构造函数中进行任何初始化操作.
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)
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)
不幸的是,没有办法初始化数组成员直到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)
归档时间: |
|
查看次数: |
127501 次 |
最近记录: |