Прежде всего, я хочу сказать, что мне известно, что этот вопрос задавался раньше (например, здесь Устранение круговой зависимости между классами шаблонов).
Однако это решение (отделение объявления от реализации) работает только при помещении обоих классов в один файл. В моем случае у меня есть StateManager и State класс, оба из которых довольно большие и гарантированно будут расти. Таким образом, наличие их в одном большом файле мне кажется неудовлетворительным.
Вот несколько важных фрагментов кода:
// Forward declare the StateManager --> does not work (incomplete type)
class State
{
public:
template <class TData>
void RequestStackPush(ID stateId, std::shared_ptr<TData> data);
private:
StateManager & stataManager;
}
Здесь реализация метода RequestStackPush()
template<class TData>
inline void State::RequestStackPush(ID stateId, std::shared_ptr<TData> data)
{
// Uses the state manager's PushState() method - here the issue with the incomplete type arises
stateManager.PushState<TData>(stateId, data);
}
Очевидно, StateManager
все время использует класс State
. Он создает методы вызова и т. Д., Поэтому предварительное объявление здесь не является решением. Просто чтобы дать вам пример:
template<class TData>
inline void StateManager::PushState(State::ID stateId, std::shared_ptr<TData> data)
{
std::unique_ptr<BasePendingChange> pendingChange = std::make_unique<PendingPushDataChange<TData>>(Push, stateId, data);
pendingChangeQueue.push(std::move(pendingChange));
}
В настоящее время оба класса находятся в одном большом файле. Во-первых, объявление класса State
с объявлением вперед StateManager
, за которым следует объявление класса StateManager
, за которым следует реализация описанного выше метода State::RequestStackPush()
и, наконец, реализация всех методов шаблона StateManager.
Как я могу разделить это на два разных файла?
StateManager
и методаRequestStackPush
? Насколько плохо это было бы для остальной части вашего кода? - person Sebastian Redl   schedule 14.12.2017