vispirms es vēlos teikt, ka apzinos, ka šāda veida jautājums ir uzdots jau iepriekš (piemēram, šeit Cirkulāras atkarības atrisināšana starp veidņu klasēm).
Tomēr šis risinājums (Deklarācijas atdalīšana no ieviešanas) darbojas tikai tad, ja abas klases ievieto vienā failā. Manā gadījumā man ir StateManager un State klase, kuras abas ir diezgan lielas, un tām ir garantēta izaugsme. Tādējādi to ievietošana vienā lielā failā man šķiet neapmierinoša.
Šeit ir daži svarīgi koda fragmenti:
// 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;
}
Šeit ir RequestStackPush()
metodes ieviešana
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);
}
Acīmredzot StateManager
visu laiku izmanto State
klasi. Tas rada tā izsaukšanas metodes utt., tāpēc pārsūtīšanas deklarācija šeit nav risinājums. Lai sniegtu jums piemēru:
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));
}
Šobrīd abas klases ir vienā lielā failā. Pirmkārt, tiek deklarēta State
klases deklarācija ar StateManager
, kam seko klases StateManager
deklarācija, kam seko iepriekš aprakstītās State::RequestStackPush()
metodes ieviešana un visbeidzot visu StateManager veidņu metožu ieviešana.
Kā es varu to sadalīt divos dažādos failos?
StateManager
atsauci unRequestStackPush
metodi? Cik slikti tas varētu ietekmēt pārējo kodu? - person Sebastian Redl   schedule 14.12.2017