Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
内联文件之间的循环依赖关系 在我的C++中,我有一个四元数类和一个向量类。它们的布局如下:_C++_Templates_Inline_Circular Dependency - Fatal编程技术网

内联文件之间的循环依赖关系 在我的C++中,我有一个四元数类和一个向量类。它们的布局如下:

内联文件之间的循环依赖关系 在我的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运算符+(向

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运算符+(向量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;
      ...
    };