内联文件之间的循环依赖关系 在我的C++中,我有一个四元数类和一个向量类。它们的布局如下:
Vector3.hpp:内联文件之间的循环依赖关系 在我的C++中,我有一个四元数类和一个向量类。它们的布局如下:,c++,templates,inline,circular-dependency,C++,Templates,Inline,Circular Dependency,Vector3.hpp: #pragma once template<typename T> struct Vector3 { //... }; template<typename T> Vector3<T> operator+(Vector3<T> lhs, Vector3<T> rhs); #include "Vector3.inl" #pragma一次 模板 结构向量3 { //... }; 模板 向量3运算符+(向
#pragma once
template<typename T>
struct Vector3
{
//...
};
template<typename T>
Vector3<T> operator+(Vector3<T> lhs, Vector3<T> rhs);
#include "Vector3.inl"
#pragma一次
模板
结构向量3
{
//...
};
模板
向量3运算符+(向量3左侧,向量3右侧);
#包括“Vector3.inl”
向量3.inl
template<typename T>
Vector3<T> operator+(Vector3<T> lhs, Vector3<T> rhs)
{
return Vector3<T>(lhs.x+rhs.x, lhs.y+rhs.y, lhs.z+rhs.z);
}
//...
模板
向量3运算符+(向量3左侧,向量3右侧)
{
返回向量3(左S.x+右S.x,左S.y+右S.y,左S.z+右S.z);
}
//...
四元数
类的布局相同
目前,我有一个四元数类,它使用Vector3
类作为函数参数,因此它#包括Vector3.hpp
头。但是现在我需要在我的Vector3
类中使用Quaternion
类来实现某些功能
由于这只在函数的实现中需要,我通常只将#include
放在源文件中,但由于我使用的是内联文件,它们包含在头文件中,这样做只会导致一系列编译器错误,因为它们相互依赖
当我只能使用头文件/内联文件时,如何解决这种循环依赖关系?处理循环依赖关系的最佳方法是首先避免它!明智的做法是花一些时间重新考虑设计、改变功能、拆分类以及类似的问题
假设没有循环依赖项的情况如下所示:
template <typename T>
struct Vector{
...
};
template<typename T>
struct VectorUser{
Vector<T> v;
...
};
但如果远期申报还不够呢?例如:
template <typename T>
struct Vector{
VectorUser<T> user;
...
};
模板
结构向量{
矢量用户;
...
};
嗯,即使没有模板,您也无法编译它。我在代码中经常看到至少两个选项:
使Vector::user
成为指针/引用,这样转发声明就足够了
将Vector
分为两类:一个基类用于VectorUser
中,另一个派生自该基类,所有功能取决于VectorUser
我支持第二种解决方案,但它可能并不总是可行的 为什么必须只使用头文件/内联文件?至少您应该考虑将代码<代码> >包含“VCurr3.IL/<代码>从<代码> vcto3.Hpp到消费<代码> .CPP文件。
//Vector.h:
template <typename T>
struct VectorUser;
template <typename T>
struct Vector{
void printout(VectorUser<T> &user);
...
};
//VectorUser.h:
template<typename T>
struct VectorUser{...}
};
template<typename T>
void Vector<T>::printout(VectorUser<T> &user){
user.printout();
}
template <typename T>
struct Vector{
VectorUser<T> user;
...
};