如何让它调用正确的构造函数?

时间:2013-05-23 21:19:19

标签: c++ constructor default-constructor

当我创建一个像这样的用户定义类的数组时,它将默认构造每个元素:

S s[5]; // calls default constructor five times, one for each S object

但是如果我的类不是默认构造的呢?我如何能够实例化并稍后使用这个数组?

例如,我的类S可能不是默认构造的,但 有另一个构造函数,如下所示:

S(int, int);

如何让它调用此构造函数而不是默认构造函数?

3 个答案:

答案 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::arraystd::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);

只是为了能够调用其他构造函数