C++中使用构造函数、get/set方法时编译报错求助
C++员工类编译错误排查与解决
我用C++编写员工数据处理代码,通过构造函数、get/set方法实现员工类,分为emp.h头文件、emp.cpp和Main.cpp源文件,但编译时出现错误,相关代码及错误信息如下,求解决办法。
代码文件
emp.h
#include<iostream> class Employee { private: std::string emp_Name,emp_ID,emp_Address; public: Employee(std::string name, std::string id, std::string address):emp_Name(name), emp_ID(id),emp_Address(address) { } void setempname(std::string name); void setempid(std::string id); void setempage(std::string address); std::string getempname(); std::string getempid(); std::string getempaddress(); };
emp.cpp
#include "emp.h" void Employee::setempname(std::string name) { emp_Name=name; } void Employee::setempid(std::string id) { emp_ID=id; } void Employee::setempage(std::string address) { emp_Address=address; } std::string Employee::getempname() { return emp_Name; } std::string Employee::getempid() { return emp_ID; } std::string Employee::getempaddress() { return emp_Address; }
Main.cpp
#include "emp.h" int main() { Employee emp[2]; emp[0]= Employee ("Rohi","E345","Clk"); return 0; }
编译错误信息
g++ emp.cpp Main.cpp Main.cpp: In function ‘int main()’: Main.cpp:4:23: error: no matching function for call to ‘Employee::Employee()’ Employee emp[2]; ^ In file included from Main.cpp:1: emp.h:7:3: note: candidate: ‘Employee::Employee(std::__cxx11::string, std::__cxx11::string, std::__cxx11::string)’ Employee(std::string name, std::string id, std::string address):emp_Name(name), ^~~~~~~~ emp.h:7:3: note: candidate expects 3 arguments, 0 provided emp.h:2:7: note: candidate: ‘Employee::Employee(const Employee&)’ class Employee ^~~~~~~~ emp.h:2:7: note: candidate expects 1 argument, 0 provided emp.h:2:7: note: candidate: ‘Employee::Employee(Employee&&)’ emp.h:2:7: note: candidate expects 1 argument, 0 provided
错误原因分析
当显式定义了带参数的构造函数后,C++编译器不会自动生成默认构造函数(无参构造函数)。代码中Employee emp[2];试图创建包含2个Employee对象的数组,这需要调用默认构造函数初始化数组中的每个元素,但类中没有该构造函数,因此触发编译错误。
另外还有一个语义问题:setempage函数名不符合逻辑,它的参数是地址(address),作用是设置emp_Address,建议改名为setempaddress,避免代码语义混淆。
解决方案
方案一:添加默认构造函数
在emp.h的public区域添加默认构造函数,有两种写法:
写法1:使用默认生成(C++11及以上)
class Employee { // ... 原有代码 ... public: Employee() = default; // 添加此行 Employee(std::string name, std::string id, std::string address):emp_Name(name), emp_ID(id),emp_Address(address) { } // ... 原有代码 ... };
写法2:手动实现空构造函数(兼容旧标准)
class Employee { // ... 原有代码 ... public: Employee() {} // 添加此行 Employee(std::string name, std::string id, std::string address):emp_Name(name), emp_ID(id),emp_Address(address) { } // ... 原有代码 ... };
方案二:直接初始化数组元素
避免使用默认构造函数,在创建数组时直接用带参数的构造函数初始化每个元素:
#include "emp.h" int main() { // 直接初始化数组中的对象 Employee emp[2] = { Employee("Rohi","E345","Clk"), Employee("John","E678","NYC") // 第二个对象需同步初始化 }; return 0; }
如果不需要立即初始化所有元素,也可以用std::vector代替数组,更灵活:
#include "emp.h" #include <vector> int main() { std::vector<Employee> emp; emp.emplace_back("Rohi","E345","Clk"); // 直接构造对象加入容器 // 后续可随时添加更多对象 return 0; }
内容的提问来源于stack exchange,提问作者potti rohith
相关产品推荐
相关产品推荐

