Ensinnäkin haluan sanoa, että olen tietoinen siitä, että tällaista kysymystä on esitetty aiemmin (esim. täällä Malliluokkien välisen pyöreän riippuvuuden ratkaiseminen).
Tämä ratkaisu (Deklaroinnin erottaminen toteutuksesta) toimii kuitenkin vain, kun molemmat luokat laitetaan yhteen tiedostoon. Minun tapauksessani minulla on StateManager ja State-luokka, jotka molemmat ovat melko suuria ja kasvavat taatusti. Siksi niiden pitäminen yhdessä suuressa tiedostossa ei mielestäni ole tyydyttävää.
Tässä muutamia tärkeitä koodinpätkiä:
// 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;
}
Tässä menetelmän RequestStackPush()
toteutus
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);
}
On selvää, että StateManager
käyttää luokkaa State
koko ajan. Se luo se kutsuu menetelmiä jne. joten välitysilmoitus ei ole ratkaisu tässä. Antaakseni sinulle esimerkin:
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));
}
Tällä hetkellä molemmat luokat ovat yhdessä suuressa tiedostossa. Ensin luokan State
ilmoitus, jossa StateManager
on ilmoitettu eteenpäin, jota seuraa luokan StateManager
ilmoitus, jota seuraa yllä kuvatun State::RequestStackPush()
-metodin toteutus ja lopuksi kaikkien StateManager-mallimenetelmien toteutus.
Miten voin erottaa tämän kahdeksi eri tiedostoksi?
StateManager
-viittauksen jaRequestStackPush
-menetelmän poistamista? Kuinka huono se olisi muulle koodillesi? - person Sebastian Redl   schedule 14.12.2017