将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
相关产品推荐
相关产品推荐

