c ++如何处理循环依赖?

时间:2010-10-24 01:56:12

标签: c++ include circular-dependency

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

但是 - 在某些情况下,将函数实现放入cpp文件是很糟糕的 - 特别是在处理模板或内联函数时。

因此 - 是否有其他方法可以处理循环#include链而不是使用前向声明?

谢谢!

1 个答案:

答案 0 :(得分:7)

你应该限制这种循环依赖,因为它们使代码难以理解并且难以使用。

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

#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