neb*_*rot 3 c++ multiple-definition-error
我已经意识到这里已经存在很多"多重定义"的问题了,但是我花了2个多小时寻找解释而没有找到解释.很抱歉,如果这是重复的话.
现在我有2个类:Array.h和Vector.h.既没有任何全局变量,也没有依赖于另一个(即Array不使用Vector而Vector不使用Array).实现在.h文件中.
这是我的Main.cpp:
#include <iostream>
#include "Array.h"
#include "Vector.h"
using namespace std;
int main() {
cout << "Done" << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
......一切都运行良好.但是,当我使用#include语句创建另一个.cpp文件时......
DataReader.cpp
#include "Array.h"
#include "Vector.h"
Run Code Online (Sandbox Code Playgroud)
...然后一切都爆炸了,我在Vector中的每个方法,构造函数和运算符重载都得到了一大堆错误:
DataReader.o: In function `Vector':
C:\C++\Eclipse CDT\workspace\3D_Adaptive_FEM\Debug/..//Vector.h:49: multiple definition of `Vector::Vector()'
TestMain.o:C:\C++\Eclipse CDT\workspace\3D_Adaptive_FEM\Debug/..//Vector.h:49: first defined here
DataReader.o: In function `Vector':
C:\C++\Eclipse CDT\workspace\3D_Adaptive_FEM\Debug/..//Vector.h:53: multiple definition of `Vector::Vector(int const&, int const&, int const&)'
TestMain.o:C:\C++\Eclipse CDT\workspace\3D_Adaptive_FEM\Debug/..//Vector.h:53: first defined here
DataReader.o: In function `Vector':
C:\C++\Eclipse CDT\workspace\3D_Adaptive_FEM\Debug/..//Vector.h:56: multiple definition of `Vector::Vector(double const&, double const&, double const&)'
TestMain.o:C:\C++\Eclipse CDT\workspace\3D_Adaptive_FEM\Debug/..//Vector.h:56: first defined here
DataReader.o: In function `ZNK6Vector1xEv':
C:\C++\Eclipse CDT\workspace\3D_Adaptive_FEM\Debug/..//Vector.h:59: multiple definition of `Vector::x() const'
TestMain.o:C:\C++\Eclipse CDT\workspace\3D_Adaptive_FEM\Debug/..//Vector.h:59: first defined here
etc...
Run Code Online (Sandbox Code Playgroud)
但是,如果我只是#include "Array.h"在DataReader.cpp中,那么一切运行正常!
可能出错的#include "Vector.h"是什么不适用于#include "Array.h"?
编辑:将实现分成.cpp文件修复错误,但这并不能解释为什么我必须为Vector而不是Array执行此操作.
我怀疑你在标题中有这些函数的外部定义.例如
#ifndef VECTOR_H
#define VECTOR_H
class Vector
{
public:
Vector(int x, int y, int z);
private:
int m_x, m_y, m_z;
};
Vector::Vector(int x, int y, int z)
: m_x(x), m_y(y), m_z(z)
{}
#endif
Run Code Online (Sandbox Code Playgroud)
由于构造函数的定义在类定义中不是内联的,因此编译器不会隐式地使用它inline.现在,如果您在多个翻译单元(即*.cpp文件)中包含相同的文件,链接器将产生您看到的错误,因为每个*.cpp文件将包含其自己的构造函数定义,而不会将它们标记为内联函数.
解决方案很简单,只需inline在构造函数声明前面放一个:
class Vector
{
public:
inline Vector(int x, int y, int z);
// ...
};
// ...
Run Code Online (Sandbox Code Playgroud)
或者,如果函数体很短,就像上面显示的构造函数一样,直接将函数定义内联到类定义中,如
class Vector
{
public:
Vector(int x, int y, int z)
: m_x(x), m_y(y), m_z(z)
{}
// ...
};
// ...
Run Code Online (Sandbox Code Playgroud)