如何让它调用正确的构造函数
How do I make it call the right constructor?
当我像这样创建一个用户定义类的数组时,它将默认构造每个元素:
S s[5]; // calls default constructor five times, one for each S object
但是如果我的类不是默认可解释的呢?我将如何实例化和以后使用这个数组?
例如,我的类S
可能不是默认可解释的,但它确实有另一个这样的构造函数:
S(int, int);
我如何使它调用这个构造函数而不是默认的构造函数?
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();
使用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));
// ...
但是你的类应该是可复制的,以便编译。
过去我做过一些:
S** s = new S*[5];
s[0] = new S(1, 2);
s[1] = new S(1, 2);
只是为了能够调用其他构造函数
相关文章:
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 确保所有构造函数调用相同的函数 c++ 设计模式
- 减少复制构造函数调用
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 在 Google 测试中,我可以从构造函数调用 GetParam() 吗?
- C++ - 从另一个类构造函数调用类构造函数
- 在C++中初始化带有和不使用构造函数调用的对象有什么区别
- 是否可以从移动构造函数调用默认构造函数?
- 在模板生成器模式中分解重复的构造函数调用
- std::atexit 从全局对象的构造函数调用时的排序
- 对构造函数调用的约束
- 编译器错过了无效的构造函数调用,并调用不存在的(或私有的)默认构造函数
- 用构造函数调用填充向量
- 创建指针时是否没有构造函数调用
- 使用 emplace_back 避免移动构造函数调用的最佳方法?
- C++ 抽象类构造函数调用
- 为什么函数参数将带有参数的构造函数调用
- 为什么比“构造函数”调用更多的“解构器”调用
- 将对象传递给函数并不是导致构造函数调用