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

标签 c++ include circular-dependency

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

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

因此 - 除了使用前向声明之外,还有其他方法可以处理循环#include 链吗?

谢谢!

最佳答案

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

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

#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

关于c++如何处理循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4006875/

相关文章:

CUDA C 代码上的 C++ 关键字

c++ - C++ 中的包含和转发声明

c++ - MSVC中<>和 ""的区别

c++ - 为什么当 MySQL 服务器不可用时我的程序崩溃

C++ 定义 3 个参数但只使用 2 个

.net - .NET 中的循环 DLL 依赖项

c++ - 如何使用模板方法避免循环依赖

c++ - 在它自己的指针上模板化一个类?

c++ - 成员函数调用的对象右值传播

c# - EF : Include with where clause