Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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++;如何处理循环依赖关系?_C++_Include_Circular Dependency - Fatal编程技术网

C++ c++;如何处理循环依赖关系?

C++ c++;如何处理循环依赖关系?,c++,include,circular-dependency,C++,Include,Circular Dependency,通常,如果我的#include链是循环的,我会通过用向前声明替换其中一个#include来解决它,然后将依赖于此类型的所有函数实现移动到cpp文件中,在cpp文件中我#包含头 但是,在某些情况下,将函数实现放入cpp文件是不好的,尤其是在处理模板或内联函数时 因此,是否有其他方法来处理循环#包含链而不是使用前向声明 谢谢 您应该限制这种循环依赖,因为它们使代码难以理解和使用 也就是说,有时这种依赖性是必要的。在这些情况下,您可以在单个头文件中声明所有实体,然后在所有声明之后为任何函数模板和内联函

通常,如果我的#include链是循环的,我会通过用向前声明替换其中一个#include来解决它,然后将依赖于此类型的所有函数实现移动到cpp文件中,在cpp文件中我#包含头

但是,在某些情况下,将函数实现放入cpp文件是不好的,尤其是在处理模板或内联函数时

因此,是否有其他方法来处理循环#包含链而不是使用前向声明


谢谢

您应该限制这种循环依赖,因为它们使代码难以理解和使用

也就是说,有时这种依赖性是必要的。在这些情况下,您可以在单个头文件中声明所有实体,然后在所有声明之后为任何函数模板和内联函数提供定义。例如:

#ifndef MY_AWESOME_INCLUDE_GUARD
#define MY_AWESOME_INCLUDE_GUARD

template <typename> struct B;

template <typename T>
struct A
{
    template <typename U>
    void f(B<U>);
};

template <typename T>
struct B
{
    template <typename U>
    void f(A<U>);
};

template <typename T>
template <typename U>
void A<T>::f(B<U>) { }

template <typename T>
template <typename U>
void B<T>::f(A<U>) { }

#endif
\ifndef MY_AWESOME\u INCLUDE\u GUARD
#定义我的_AWESOME_包括_GUARD
模板结构B;
模板
结构A
{
模板
无效f(B);
};
模板
结构B
{
模板
f(A)项无效;
};
模板
模板
void A::f(B){}
模板
模板
void B::f(A){}
#恩迪夫

你能给我们举个例子吗?我很难准确理解你的意思你可以很好地转发声明模板。