C++中Car类重载构造函数出现重定义错误求助
C++构造器重定义错误解决:头文件与源文件的构造函数定义冲突
你的问题核心是违反了C++的单定义规则(ODR):在头文件的类内部,你给构造函数写了空实现{},这已经属于构造函数的定义;之后在Car.cpp里再次实现同一个构造函数,就导致编译器认为同一个函数被定义了两次,触发重定义错误。
错误根源拆解
看你Car.h里的代码:
Car(){}; Car(string userMake, string userModel, double userPrice){};
这里的{}不是空的声明,而是直接给构造函数提供了空的函数体,相当于已经完成了定义。当Car.cpp包含这个头文件后,再写Car::Car () { ... },就等于重复定义了同一个函数。
修改步骤
- 修正头文件的构造函数声明
把Car.h里构造函数的{}去掉,只保留函数签名(仅声明,不定义),同时注意标准库类型string需要加上std::前缀,还要记得包含<string>头文件:
#include <string> class Car { public: Car(); // 仅声明构造函数 Car(std::string userMake, std::string userModel, double userPrice); // 仅声明带参构造函数 std::string getMake(); std::string getModel(); double getPrice(); private: std::string make; std::string model; double price; };
- 保留源文件的构造函数实现
Car.cpp里的实现可以保留,但同样要给string加上std::前缀,同时补充getter函数的实现(否则链接阶段会报错):
#include "Car.h" Car::Car () { make = "DeLorean"; model = "Alpha5"; price = 145000; } Car::Car (std::string userMake, std::string userModel, double userPrice) { make = userMake; model = userModel; price = userPrice; } std::string Car::getMake() { return make; } std::string Car::getModel() { return model; } double Car::getPrice() { return price; }
补充说明
C++中,类成员函数的声明和定义是分开的:
- 仅写函数签名(无
{})是声明,可以在多个地方出现; - 写了
{}就是定义,整个程序中同一个函数只能有一次定义。
内容的提问来源于stack exchange,提问作者Genysys
相关产品推荐
相关产品推荐

