C++ 3 路标头中的多个定义错误包括



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

点3d.h

#ifndef POINT3D_H
#define POINT3D_H
class Ray3d;
class Vector3d;
#include "Ray3d.h"
#include "Vector3d.h"

class Point3d {
     ...
};
#endif

矢量3d.h

#ifndef VECTOR3D_H
#define VECTOR3D_H

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

class Vector3d {
    ...
};
#endif

和雷3d.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

最后我有这个子类:翻译.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

问题是当我尝试编译翻译时.cpp:

g++ Transform.cpp Translation.cpp

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

我也知道我正在做前向声明并包含在前 3 个标头中,但这是我编译它们的唯一方法。 也许是部分问题?

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

"但这是我能让它们编译的唯一方法。也许是问题的一部分?

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

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

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

最新更新