3 向 header 中的 C++ 多重定义错误包括

标签 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 文件,但所有函数都在那里定义。

然后我有这个类: 转换.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

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

g++ Transform.cpp Translation.cpp

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

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

最佳答案

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

关于3 向 header 中的 C++ 多重定义错误包括,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29088215/

相关文章:

c - 如何在单个项目中管理教科书中的大量示例代码?

c++ - 运算符优先级困惑

c++ - 如何在 Visual C++ 中读取内存地址?

c++ - 使用 Boost Dijkstra 和指定的 MAX DISTANCE 查找最短路径

android - 为android studio中native方法实现JNI生成C头文件(*.h)

caching - 强制(或高度鼓励)浏览器直接从缓存中加载网络字体

include - NASM:无法打开包含文件

c++ - cin.get() 的运行时错误

c - 避免 C 头文件中的循环依赖

file - Gradle - 将单个文件添加到 JAR