如何使用自定义类声明数组?

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)


R. *_*des 5

要默认初始化Ts 数组,T必须是默认可构造的.通常编译器会为您提供一个免费的默认构造函数.但是,由于您自己声明了构造函数,因此编译器不会生成默认构造函数.

你的选择:

  • 添加一个默认的构造函数来命名,如果这是有意义的(我不这么认为,但我不知道问题域);
  • 在声明时初始化数组的所有元素(你可以这样做,因为它name是一个聚合);

      name someName[4] = { { "Arthur", "Dent" },
                           { "Ford", "Prefect" },
                           { "Tricia", "McMillan" },
                           { "Zaphod", "Beeblebrox" }
                         };
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用一个std::vector替代,只有在构造它们时才添加元素.