tout d'abord, je tiens à dire que je suis conscient que ce genre de question a déjà été posé (par exemple ici Résoudre une dépendance circulaire entre les classes de modèles).
Cependant, cette solution (séparer la déclaration de l'implémentation) ne fonctionne que lorsque les deux classes sont placées dans un seul fichier. Dans mon cas, j'ai un StateManager et une classe State qui sont tous deux assez grands et dont la croissance est garantie. Ainsi, les avoir dans un seul gros fichier ne me semble pas satisfaisant.
Voici quelques extraits de code importants :
// 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;
}
Ici l'implémentation de la méthode 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);
}
Évidemment, le StateManager
utilise la classe State
tout le temps. Il crée des appels de méthodes, etc. donc la déclaration directe n'est pas une solution ici. Juste pour vous donner un exemple :
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));
}
Actuellement, les deux classes sont dans un seul gros fichier. Tout d'abord, la déclaration de la classe State
avec le StateManager
déclaré en avant, suivie de la déclaration de la classe StateManager
suivie de l'implémentation de la méthode State::RequestStackPush()
décrite ci-dessus et enfin de l'implémentation de toutes les méthodes du modèle StateManager.
Comment puis-je séparer cela en deux fichiers différents ?
StateManager
et la méthodeRequestStackPush
? À quel point cela serait-il mauvais pour le reste de votre code ? - person Sebastian Redl   schedule 14.12.2017