C ++, как это сделать, чтобы справиться с круговыми зависимостями? - PullRequest
2 голосов
/ 24 октября 2010

обычно, если моя цепочка #include становится круговой, я решаю ее, заменяя одно из #include предварительным объявлением, а затем перемещаю все реализации функций, которые зависят от этого типа, в файл cpp, где я #include заголовоквместо этого.

Но - в некоторых ситуациях плохо помещать реализацию функции в файл cpp - особенно когда речь идет о шаблонах или встроенных функциях.

Поэтому - Есть ли другие способы борьбы с циклическим#include цепочки вместо использования предварительных объявлений?

спасибо!

1 Ответ

7 голосов
/ 24 октября 2010

Вам следует ограничить такие циклические зависимости, потому что они затрудняют понимание кода и затрудняют работу с ним.

Тем не менее, иногда такие зависимости необходимы. В этих случаях вы можете объявить все сущности в одном заголовочном файле, а затем после все объявления предоставили определения для любых шаблонов функций и встроенных функций. Например:

#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
...