în primul rând, vreau să spun că sunt conștient de faptul că acest tip de întrebare a mai fost pus (de exemplu aici Rezolvarea unei dependențe circulare între clasele șabloane).
Cu toate acestea, această soluție (separarea declarației de implementare) funcționează numai atunci când puneți ambele clase într-un singur fișier. În cazul meu, am un StateManager și o clasă State, ambele fiind destul de mari și garantate că vor crește. Astfel, a le avea într-un singur fișier mare mi se pare nesatisfăcător.
Iată câteva fragmente de cod importante:
// 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;
}
Aici implementarea metodei 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);
}
Evident, StateManager
folosește clasa State
tot timpul. Creează că apelează metode etc., așa că declarația înainte nu este o soluție aici. Doar ca să-ți dau un exemplu:
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));
}
În prezent, ambele clase sunt într-un singur fișier mare. În primul rând, declararea clasei State
cu StateManager
fiind declarată înainte urmată de declararea clasei StateManager
urmată de implementarea metodei State::RequestStackPush()
descrise mai sus și în final implementarea tuturor metodelor șablon StateManager.
Cum pot separa acest lucru în două fișiere diferite?
StateManager
și metodaRequestStackPush
? Cât de rău ar fi asta pentru restul codului tău? - person Sebastian Redl   schedule 14.12.2017