0

我有一个关于 c++ 中模板的循环依赖的问题。我有两个模板类,Rotation3 和 Vector3。旋转保持水平和垂直旋转,而向量具有 xy 和 z 分量。

我希望每个类都有一个构造函数:

Vector3<T>::Vector3(const Rotation3<T>& rot)

和...

Vector3<T>::Rotation3(const Vector3<T>& vec)

但是,因为模板不能放在 .cpp 文件中,而必须放在 .h 中,这意味着 Vector3.h 和 Rotation3.h 必须相互包含才能相互用于它们的构造函数. 这可能吗?

提前感谢您的帮助,我对 c++ 还很陌生,我真的很想知道有经验的人将如何设计这个。

4

3 回答 3

2

通过使用#include不在文件开头但有效的指令,这有点奇怪。包含守卫比平时更重要。

// Vector3.hpp
#ifndef VECTOR3_HPP_
#define VECTOR3_HPP_

template<typename T> class Rotation3;

template<typename T> class Vector3
{
public:
    explicit Vector3(const Rotation3<T>&);
};

#include "Rotation3.hpp"

template<typename T>
Vector3<T>::Vector3(const Rotation3<T>& r)
{ /*...*/ }

#endif

// Rotation3.hpp
#ifndef ROTATION3_HPP_
#define ROTATION3_HPP_

template<typename T> class Vector3;

template<typename T> class Rotation3
{
public:
    explicit Rotation3(const Vector3<T>&);
};

#include "Vector.hpp"

template<typename T>
Rotation3<T>::Rotation3(const Vector3<T>& v)
{ /*...*/ }

#endif
于 2013-06-28T22:04:00.320 回答
1

如果 Vector3 和 Rotatio3 都是模板,则不会发生任何事情,因为模板在专门化或使用之前不会生成对象(例如 vector3)。

您可以通过组合或继承创建另一个包含 vector3 和 Rotation3 的类,并根据需要使用它们。这也可以是一个模板(模板 Vector3,模板 Rotation3> 示例)

于 2013-06-28T21:54:58.957 回答
0

像往常一样,您可以只声明内容,并且该声明可能足以满足目的。模板的声明与其他所有类似,只是省略了定义部分。

模板类成员函数也可以在类之外定义。您可以将标题拆分为仅定义类和另一个实现功能。然后您可以将它们交错包含在内。

于 2013-06-28T21:53:34.063 回答