当我创建一个像这样的用户定义类的数组时,它将默认构造每个元素:
S s[5]; // calls default constructor five times, one for each S object
但是如果我的类不是默认构造的呢?我如何能够实例化并稍后使用这个数组?
例如,我的类S
可能不是默认构造的,但 有另一个构造函数,如下所示:
S(int, int);
如何让它调用此构造函数而不是默认构造函数?
答案 0 :(得分:6)
struct S
{
const int m;
S(int p, int k) : m(p) {}
};
S arr[4] = {S(1,1), S(1,2), S(1,3), S(1,4)};
如果没有copy-ctor,您仍然可以使用以下C ++ 11列表初始化 - 因为Andy Prowl指出ctor可能不是explicit
:
S arr[4] = {{1,1}, {1,2}, {1,3}, {1,4}};
对于更具伸缩性的解决方案,您可以使用std::array
或std::vector
:
std::array<S,4> make_array()
{
// create array... and return
}
std::array<S,4> arr = make_array();
答案 1 :(得分:4)
使用std::vector
并填写您决定应如何构建的对象。
例如,在C ++ 11中,您可以使用emplace_back()
成员函数来编写如下内容:
#include <vector>
std::vector<S> v;
v.emplace_back(42, 1729);
v.emplace_back(0, 6);
// ...
甚至:
std::vector<S> v = { {42, 1729}, {0, 6} };
如果S
的构造函数未标记为explicit
。如果是这种情况,你必须写:
std::vector<S> v = { S{42, 1729}, S{0, 6} }.
回到C ++ 03,其中emplace_back()
和统一初始化不存在,你可以做到:
#include <vector>
std::vector<S> v;
v.push_back(S(42, 1729));
v.push_back(S(0, 6));
// ...
但是你的类应该是可复制的,以便编译它。
答案 2 :(得分:2)
过去我做了一些:
S** s = new S*[5];
s[0] = new S(1, 2);
s[1] = new S(1, 2);
只是为了能够调用其他构造函数