C++代码无法编译

C++ code does not compile

本文关键字:编译 代码 C++      更新时间:2023-10-16

代码无法编译。我不明白错误是什么,请帮忙)

#include <iostream>
#include <fstream>
class Record{
std::string product_name;
std::string product_category;
int price;
int amount;
public:
Record(std::string newName, std::string newCategory, int newPrice, int newAmount){
product_name=newName;
product_category=newCategory;
price=newPrice;
amount=newAmount;
}
std::string getName(){
return product_name;
}
std::string getCategory(){
return product_category;
}
int getPrice(){
return price;
}
int getAmount(){
return amount;
}
void setName(std::string newName){
product_name=newName;
}
void setCategory(std::string newCategory){
product_category=newCategory;
}
void setPrice(int newPrice){
price=newPrice;
}
void setAmount(int newAmount){
amount=newAmount;
}
};
int main(){
Record r1;
r1.setName("beer");
r1.setCategory("alcohol");
r1.setPrice(12);
r1.setAmount(32);
Record r2("carrot", "vegetables", 123, 1932);
std::cout<<r1.getName()<<" "<<r1.getCategory()<<" "<<r1.getPrice()<<" "<<r1.getAmount()<< std::endl;
std::cout<<r2.getName()<<" "<<r2.getCategory()<<" "<<r2.getPrice()<<" "<<r2.getAmount()<< std::endl;
Record r3[2];
std::string a;
float b;
unsigned int c;
for(unsigned int i=0; i<2; ++i){
std::cout<<"input name: ";
std::cin>>a;
r3[i].setName(a);
std::cout<<"input category: ";
std::cin>>a;
r3[i].setCategory(a);
std::cout<<"input price: ";
std::cin>>b;
r3[i].setPrice(b);
std::cout<<"input amount: ";
std::cin>>c;
r3[i].setAmount(c);
}
for(unsigned int i=0; i<2; ++i){
std::cout<<r3[i].getName()<<" "<<r3[i].getCategory()<<" "<<r3[i].getPrice()<<" "<<r3[i].getAmount()<< std::endl;
}
return 0;
}

错误文本: g++ -Wall -c "main.cpp" (/media/ad/4GB-NTFS/prog/laba2) main.cpp:在函数 'int main()' 中: main.cpp:46:12:错误:调用"记录::记录()"没有匹配函数 记录 r1; ^ main.cpp:12:1: 注意: 候选: 记录::记录(std::__cxx11::字符串, std::__cxx11::字符串, int, int) Record(std::string newName, std::string newCategory, int newPrice, int newAmount){ ^ 主.cpp:12:1:注意:候选人需要 4 个参数,0 提供 主.cpp:6:7: 注意: 候选人: 记录::记录(常量记录&) 类记录{ ^ 主.cpp:6:7:注意:候选人期望 1 个参数,提供 0 个参数 main.cpp:54:16:错误:调用"记录::记录()"没有匹配函数 记录 r3[2]; ^ main.cpp:12:1: 注意: 候选: 记录::记录(std::__cxx11::字符串, std::__cxx11::字符串, int, int) Record(std::string newName, std::string newCategory, int newPrice, int newAmount){ ^ 主.cpp:12:1:注意:候选人需要 4 个参数,0 提供 主.cpp:6:7: 注意: 候选人: 记录::记录(常量记录&) 类记录{ ^ 主.cpp:6:7:注意:候选人期望 1 个参数,提供 0 个参数

你的类没有默认的构造函数。所以当你说:

Record r1;

编译器不知道如何创建r1对象。创建r时,您需要提供所有参数:

Record r1( "foo", "bar", 1, 2 );

或者最好完全重新考虑程序的设计。

你已经覆盖了类的构造函数,所以没有一个接受零参数,因为这需要:

Record r1;

定义默认构造函数:

Record() {}

main.cpp:46:12:错误:调用"记录::记录()"没有匹配函数

也就是说,此时:

Record r1;

您正在尝试使用默认构造函数 (Record::Record) 实例化对象r1。实际上,您没有提供任何参数。

此外,编译器继续:

注意:候选人期望 4 个参数,0 个提供

按照类接口,实例化Record对象的唯一方法是使用提供的唯一构造函数,即:

Record(std::string, std::string, int, int);

如果要允许使用默认构造函数实例化Record对象,则必须提供它。

C++11 允许您编写:

Record() = default;

为了定义默认构造函数。

您必须定义一个没有参数的构造函数。

Record r1试图打电话给Record()但没有找到。只需在类中添加额外的构造函数即可。它可以是空的。这也将解决与Record r3[2]相同的问题。



P.S.(与问题无关,但有帮助)

查看您的代码,我建议您查看成员初始值设定项列表以实现构造函数。为什么?看这里。