Mos*_*she 13 c++ arrays constructor
我正在尝试使用自定义类声明一个数组.当我向类中添加构造函数时,我的编译器抱怨"没有用于初始化name [3]的匹配构造函数".
这是我的计划:
#include <iostream>
using namespace std;
class name {
public:
string first;
string last;
name(string a, string b){
first = a;
last = b;
}
};
int main (int argc, const char * argv[])
{
const int howManyNames = 3;
name someName[howManyNames];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能实现这一目标,我做错了什么?
Ker*_* SB 23
您必须提供默认构造函数.当你在它时,也修复你的其他构造函数:
class Name
{
public:
Name() { }
Name(string const & f, string const & l) : first(f), last(l) { }
//...
};
Run Code Online (Sandbox Code Playgroud)
或者,您必须提供初始化程序:
Name arr[3] { { "John", "Doe" }, { "Jane", "Smith" }, { "", "" } };
Run Code Online (Sandbox Code Playgroud)
后者是概念上最好的,因为没有任何理由,你的类应该有一个"默认"状态的概念.在这种情况下,您只需拥有为数组的每个元素提供适当的初始化.
C++中的对象永远不会处于错误定义的状态; 如果你想到这一点,一切都应该变得非常清楚.
另一种方法是使用动态容器,但这与您的要求不同:
std::vector<Name> arr;
arr.reserve(3); // morally "an uninitialized array", though it really isn't
arr.emplace_back("John", "Doe");
arr.emplace_back("Jane", "Smith");
arr.emplace_back("", "");
std::vector<Name> brr { { "ab", "cd" }, { "de", "fg" } }; // yet another way
Run Code Online (Sandbox Code Playgroud)
要默认初始化T
s 数组,T
必须是默认可构造的.通常编译器会为您提供一个免费的默认构造函数.但是,由于您自己声明了构造函数,因此编译器不会生成默认构造函数.
你的选择:
在声明时初始化数组的所有元素(你可以这样做,因为它name
是一个聚合);
name someName[4] = { { "Arthur", "Dent" },
{ "Ford", "Prefect" },
{ "Tricia", "McMillan" },
{ "Zaphod", "Beeblebrox" }
};
Run Code Online (Sandbox Code Playgroud)使用一个std::vector
替代,只有在构造它们时才添加元素.