para së gjithash, dua të them se jam i vetëdijshëm se kjo lloj pyetjeje është bërë më parë (p.sh. këtu Zgjidhja e një varësie rrethore midis klasave të modeleve).
Megjithatë, kjo zgjidhje (Ndarja e deklaratës nga zbatimi) funksionon vetëm kur vendosen të dyja klasat në një skedar. Në rastin tim, unë kam një StateManager dhe një klasë State, të cilat të dyja janë mjaft të mëdha dhe të garantuara për t'u rritur. Kështu, mbajtja e tyre në një skedar të madh më duket e pakënaqshme.
Këtu janë disa pjesë të rëndësishme të kodit:
// 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;
}
Këtu është zbatimi i metodës 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);
}
Natyrisht, StateManager
përdor klasën State
gjatë gjithë kohës. Ai krijon atë që quan metoda etj. kështu që deklarimi përpara nuk është zgjidhje këtu. Vetëm për t'ju dhënë një shembull:
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));
}
Aktualisht, të dyja klasat janë në një skedar të madh. Së pari, deklarimi i klasës State
me StateManager
duke u deklaruar përpara, i ndjekur nga deklarimi i klasës StateManager
i ndjekur nga zbatimi i metodës State::RequestStackPush()
të përshkruar më sipër dhe në fund zbatimi i të gjitha metodave të modelit StateManager.
Si mund ta ndaj këtë në dy skedarë të ndryshëm?
StateManager
dheRequestStackPush
referencë? Sa e keqe do të ishte kjo për pjesën tjetër të kodit tuaj? - person Sebastian Redl   schedule 14.12.2017