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

将C++类移至独立文件时遭遇重定义错误,求解决方案

C++类实现重定义错误解决

问题场景

尝试将MedianFinder类的声明放在头文件、实现放在.cpp文件,编译时触发重定义错误。

头文件medianfinderheader.h代码

class MedianFinder {
public:
    MedianFinder() {};
    void addNum(int num) {};
    
    double findMedian() { 
        double x=1.0;
        return x;
        };
};

实现文件MedianFinderClass.cpp代码

#include "medianfinderheader.h"
    MedianFinder::MedianFinder() { 
        }
        
    void MedianFinder::addNum(int num) {
        
    }
        
    double MedianFinder::findMedian() {
        double x=1.0;
        return x;
            
    }

编译错误信息

g++ -I./ -g -Og -std=c++14   main.cpp MedianFinderClass.cpp -o medianEX
MedianFinderClass.cpp:2:5: error: redefinition of 'MedianFinder::MedianFinder()'
    2 |     MedianFinder::MedianFinder() {
      |     ^~~~~~~~~~~~
In file included from MedianFinderClass.cpp:1:
medianfinderheader.h:3:5: note: 'MedianFinder::MedianFinder()' previously defined here
    3 |     MedianFinder() {};
      |     ^~~~~~~~~~~~
MedianFinderClass.cpp:5:10: error: redefinition of 'void MedianFinder::addNum(int)'
    5 |     void MedianFinder::addNum(int num) {
      |          ^~~~~~~~~~~~
In file included from MedianFinderClass.cpp:1:
medianfinderheader.h:4:10: note: 'void MedianFinder::addNum(int)' previously defined here
    4 |     void addNum(int num) {};
      |          ^~~~~~
MedianFinderClass.cpp:9:12: error: redefinition of 'double MedianFinder::findMedian()'
    9 |     double MedianFinder::findMedian() {
      |            ^~~~~~~~~~~~
In file included from MedianFinderClass.cpp:1:
medianfinderheader.h:6:12: note: 'double MedianFinder::findMedian()' previously defined here
    6 |     double findMedian() {

错误原因

头文件中给成员函数添加了{},这相当于直接在头文件里定义了函数;之后在.cpp文件里又再次定义了这些函数,编译器会判定为重复定义。

解决方法

有两种可行方案:

方案1:头文件只保留函数声明,实现放在.cpp文件

修改后的medianfinderheader.h:

class MedianFinder {
public:
    MedianFinder(); // 仅声明,无函数体
    void addNum(int num);
    
    double findMedian();
};

MedianFinderClass.cpp保持原有代码即可,可调整缩进更规范:

#include "medianfinderheader.h"

MedianFinder::MedianFinder() { 
}

void MedianFinder::addNum(int num) {
}

double MedianFinder::findMedian() {
    double x=1.0;
    return x;
}

方案2:头文件内联实现函数(适合简单函数)

如果希望在头文件里直接实现函数,需要给函数加上inline关键字,这样编译器会将其视为内联函数,不会触发重定义:

class MedianFinder {
public:
    inline MedianFinder() {};
    inline void addNum(int num) {};
    
    inline double findMedian() { 
        double x=1.0;
        return x;
    };
};

这种情况下不需要在.cpp文件里再实现这些函数。

内容的提问来源于stack exchange,提问作者Shaun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:45:37