първо, искам да кажа, че съм наясно, че този тип въпроси са задавани и преди (напр. тук Разрешаване на кръгова зависимост между шаблонни класове).
Това решение обаче (Разделяне на декларацията от изпълнението) работи само когато поставите двата класа в един файл. В моя случай имам 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