无法创建一个类的数组

时间:2018-04-20 23:15:22

标签: c++

ssl=0x7ebb528840: I/O error during system call, Broken pipe

该程序定义了一个包含一个人的类    重载插入操作符。     还包括personDisplay操纵器     为名称设置字段大小。     该程序最多可获得10个条目,然后显示     结果分为两列。错误是

  

main.cpp:41:15:错误:没有匹配函数来调用'Person :: Person()'       人p [MAX];

如何修复此错误? 谢谢你的时间。

4 个答案:

答案 0 :(得分:2)

学习代码的学生经常必须使用数组,因为老师希望他们能够使用数组,但我会解释一个更容易正确且更强大的C ++方法...如果你现在不能使用它你很快就会想要。

user4581301很好地解释了为什么以及如何添加允许您使用数组的默认构造函数。在修复之后的缺点是,你有这些默认初始化的数组成员,其中实际上没有正确的ID和名称,必须自己维护count以了解哪些是“正在使用”,并且仍有MAXPerson的程序可以处理的std::vector<Person> p;

更好的解决方法是删除数组并使用:

#include <vector>

(您需要在程序上p[x] = Person(name, id);才能执行此操作。)

然后,您可以将行p.emplace_back(name, id); 更改为:

Person

这会在vector的“后面”添加count。您可以删除Person变量及其用途:如果您想知道vector中有p.size()vector,您可以致电for (const Person& person : p) { cout << ...etc...

最后一个好处是您可以使用:

遍历#include <iostream> #include <fstream> #include <string> #include <iomanip> #include <vector> class Person { public: Person(int id, std::string name); friend std::ostream& operator<<(std::ostream&, const Person&); private: int idNum_; std::string name_; }; Person::Person(int idNum, std::string name) : idNum_{idNum}, name_{std::move(name)} { } std::ostream& operator<<(std::ostream& out, const Person& p) { return out << p.name_ << ' ' << p.idNum_; } std::ostream& personDisplay(std::ostream& s) { s.setf(std::ios::left); s.width(12); return s; } int main() { const int QUIT = 0; const int MAX = 10; std::vector<Person> persons; int id; std::string name; while (persons.size() < MAX && std::cout << "Enter an ID number or " << QUIT << " to quit " && std::cin >> id && id != QUIT) { std::cout << " Enter name "; std::cin >> name; persons.emplace_back(id, std::move(name)); } int personsPrinted = 0; for (const auto& person : persons) { std::cout << personDisplay << person; if (++personsPrinted % 2 == 0) std::cout << '\n'; else std::cout << " "; } if (persons.size() % 2) std::cout << '\n'; }
pod install

可以对代码进行许多其他较小的改进,最终:

react-native link

(可在coliru.stackedcrooked.com上运行/编辑的代码)

答案 1 :(得分:1)

INSERT INTO mysql_table (`guid-pk`, `name`, `favorite_number`, `modifiedon` )
SELECT s.`guid-pk`, s.`name`, s.`favorite_number`, s.`modifiedon`
  FROM temp_table s
 ORDER
    BY s.`guid-pk`
 ON DUPLICATE KEY
 UPDATE `name`            = VALUES( `name` )
      , `favorite_number` = VALUES( `favorite_number` )
      , `modifiedon`      = VALUES( `modifiedon` )

需要默认构造函数来默认初始化Person p[MAX]; 的所有元素。不幸的是定义了

p

阻止编译器自动生成默认构造函数。

您可以使用统一初始化来初始化Person(const int, const string); 的所有元素,但是由于您只是在用户提供输入时将加载数组,因此看起来并不重要。

让我们告诉编译器我们仍然需要一个默认的构造函数。

p

Person() = default;

如果编译旧的C ++标准。

附录:Tony Delroy的答案是对的。如果您被允许使用Person() {} ,请使用它。如果没有,这可能是劣等选择的最佳选择。

答案 2 :(得分:0)

构造Person对象数组需要一个默认构造函数(不带参数的构造函数)。你没有提供。

答案 3 :(得分:0)

宣布

Person p[MAX];

您不仅要声明数据类型,还要尝试使用不带参数的构造函数创建MAX数量的Person对象 - 这里的Person类中不存在这些参数。请记住,当您为类创建任何构造函数时,编译器不会自动为您创建默认构造函数。

您应该声明一个没有参数的Person构造函数,或者您可能希望使用Person指针数组。