三向头中的C ++多重定义错误包括

时间:2015-03-16 22:37:28

标签: c++ header include g++

我有3个头文件定义对象:

Point3d.h

#ifndef POINT3D_H
#define POINT3D_H

class Ray3d;
class Vector3d;
#include "Ray3d.h"
#include "Vector3d.h"


class Point3d {
     ...
};
#endif

Vector3d.h

#ifndef VECTOR3D_H
#define VECTOR3D_H


class Point3d;
class Ray3d;

#include "Ray3d.h"
#include "Point3d.h"


class Vector3d {
    ...

};

#endif

和Ray3d.h

#ifndef RAY3D_H
#define RAY3D_H


class Point3d;
class Vector3d;

#include "Point3d.h"
#include "Vector3d.h"


class Ray3d {
    ...

};

#endif

我不会包含.cpp文件,但所有功能都在那里定义。

然后我有这堂课: Transform.h

#ifndef TRANSFORM_H
#define TRANSFORM_H

#include <Eigen/Dense>
#include "../../geometry/Ray3d.cpp"
#include "../../geometry/Point3d.cpp"
#include "../../geometry/Vector3d.cpp"


using Eigen::MatrixXd;


class Transform {
    ...
};
#endif

最后我有这个子类: Translation.h

#ifndef TRANSLATION_H
#define TRANSLATION_H

//#include <Eigen/Dense>

#include "Transform.h"


//#include "../../geometry/Point3d.cpp"
//#include "../../geometry/Vector3d.cpp"
//#include "../../geometry/Ray3d.cpp"

using Eigen::MatrixXd;


class Translation : public Transform {
    ...
};
#endif

问题在于我尝试编译Translation.cpp:

g++ Transform.cpp Translation.cpp

我为Ray3d,Point3d和Vector3d中的每个方法获得了函数错误的多重定义。我该怎么做才能避免这种情况?我应该少包括吗?我的g ++命令错了吗?谢谢!

我也意识到我正在进行前向声明并包含在前3个标题中,但这是我可以获得编译的唯一方法。部分问题可能是?

2 个答案:

答案 0 :(得分:1)

您不应在transform.h中包含cpp文件

答案 1 :(得分:0)

  

&#34;但这是我可以编译的唯一方法。部分问题可能是?&#34;

您可以单独编译和链接.cpp个文件,而不是包含它们(即从预处理器中看到)。

您的编译器命令行应该看起来像

g++ ../../geometry/Ray3d.cpp 
    ../../geometry/Point3d.cpp
    ../../geometry/Vector3d.cpp 
    Transform.cpp Translation.cpp
    -o MyExecutable