Jared
Jared

Reputation: 3

C++ multiple definition errors in 3-way header include

I have 3 header files defining objects:

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

and Ray3d.h

#ifndef RAY3D_H
#define RAY3D_H


class Point3d;
class Vector3d;

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


class Ray3d {
    ...

};

#endif

I won't include the .cpp files, but all the functions are defined there.

And then I have this class: 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

AND FINALLY I have this subclass: 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

The problem is when I try to compile Translation.cpp:

g++ Transform.cpp Translation.cpp

I get a multiple definition of function error for every method in Ray3d, Point3d, and Vector3d. What can I do do avoid this? Should I be including less? Is my g++ command wrong? Thanks!

I'm also aware that I'm doing both forward declaration and includes in the first 3 headers, but that was the only way I could get those to compile. Part of the problem maybe?

Upvotes: 0

Views: 181

Answers (2)

πάντα ῥεῖ
πάντα ῥεῖ

Reputation: 1

"but that was the only way I could get those to compile. Part of the problem maybe?"

You compile and link .cpp files separately, instead of including them (i.e. being seen from the preprocessor).

Your compiler command line should look rather like

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

Upvotes: 0

Niclas
Niclas

Reputation: 156

You should not include the cpp files in transform.h

Upvotes: 1

Related Questions