You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中Car类重载构造函数出现重定义错误求助

C++构造器重定义错误解决:头文件与源文件的构造函数定义冲突

你的问题核心是违反了C++的单定义规则(ODR):在头文件的类内部,你给构造函数写了空实现{},这已经属于构造函数的定义;之后在Car.cpp里再次实现同一个构造函数,就导致编译器认为同一个函数被定义了两次,触发重定义错误。

错误根源拆解

看你Car.h里的代码:

Car(){}; 
Car(string userMake, string userModel, double userPrice){};

这里的{}不是空的声明,而是直接给构造函数提供了空的函数体,相当于已经完成了定义。当Car.cpp包含这个头文件后,再写Car::Car () { ... },就等于重复定义了同一个函数。

修改步骤

  1. 修正头文件的构造函数声明
    把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;
};
  1. 保留源文件的构造函数实现
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:50:27