C++, les deux classes avec des besoins mutuels
J'ai converti un scientifique de la plate-forme de simulation à partir de Java en C++. J'ai essayé de garder le design, autant que possible, la même que la précédente, la mise en œuvre. En java, en raison de la liaison tardive, dépendances circulaires sont résolus au moment de l'exécution. Cependant, les dépendances circulaires ont créé un sacré bordel en C++.
- Est-il un outil automatisé qui analyse et répertorie la circulaire comprend et références? (Visual Studio 2010, seules les questions une énorme liste de bêtises erreurs).
- J'ai essayé d'utiliser les références vers l'avant dans la mesure du possible. Cependant dans certaines occasions, les deux classes ont besoin de fonctionnalités de l'autre classe (c'est à dire appel à des méthodes qui rend impossible l'utilisation de l'avant référence). Ces besoins existent dans la Logique et si j'ai changer radicalement la conception, ils ne seront plus représenter le monde réel des interactions.
Comment pourrions-nous mettre en œuvre des deux classes qui ont besoin les uns des autres méthodes et l'état? Est-il possible de les mettre en œuvre en C++?
Exemples:
- Exemple 1: j'ai une classe appelée "Monde", qui crée des Objets de type "Agent". L'Agent doit appeler du Monde de méthodes pour obtenir des informations de son environnement. Monde a aussi besoin de parcourir des Agents et de l'exécution de leur "run" de la méthode et obtenir leur statut (mises à jour de statut peuvent faire éventuellement l'inverse de résoudre cette section du problème, mais pas la méthode run).
- Exemple 2: les Agents de créer une collection de leurs "Intentions". Chaque Agent doit itérer sur ses intentions et exécution/mise à jour/lire intention d'état. Intentions aussi besoin d'obtenir des informations sur l'environnement par l'intermédiaire de l'Agent (si elle est faite directement par le biais de "Monde", il va créer des cercles encore une fois) et aussi des informations de l'Agent lui-même.
Diagramme ci-dessous montre un sous-ensemble de classes, et certaines de leurs méthodes et de propriétés:
Si vous avez des problèmes avec des erreurs, vous pouvez toujours poster une question contenant ces erreurs (verbatim) et quelqu'un sera probablement en mesure de vous aider avec elle. Aussi, ces erreurs peuvent être aucun sens pour vous, mais pas pour quelqu'un d'autre. Il est également très difficile de répondre à des questions sans voir un peu de code, et pour cela, je vous recommande la lecture de sscce.org.
Joachim, Ils sont le type d'erreurs qui sont générés dans la circulaire de la dépendance des cas. Les Classes ne peuvent pas être identifiés.
Poster le code est beaucoup plus utile que de l'affichage de l'erreur. L'affichage est le meilleur.
Mike, le code est près de 50 000 lignes de code. J'ai besoin de couper et de la construction d'un petit cas de de il qui reproduit les erreurs. En attendant, je ne sais pas mettre inclure des fichiers sur le dessus de la rpc fichier permettrait de résoudre la référence directe problème. Je suppose que votre réponse va résoudre mon problème.
Ajout d'un diagramme. J'espère que ça aidera.
Joachim, Ils sont le type d'erreurs qui sont générés dans la circulaire de la dépendance des cas. Les Classes ne peuvent pas être identifiés.
code
1>e:\programming\cprojt\actiondb11\actiondb\base\world.h(35): error C2143: erreur de syntaxe : manquant ',' avant '*' 1>e:\programming\cprojt\actiondb11\actiondb\base\world.h(36): error C2061: erreur de syntaxe : identificateur 'Agent' 1>e:\programming\cprojt\actiondb11\actiondb\base\world.h(50): error C2065: 'Agent' : identificateur non déclaréPoster le code est beaucoup plus utile que de l'affichage de l'erreur. L'affichage est le meilleur.
Mike, le code est près de 50 000 lignes de code. J'ai besoin de couper et de la construction d'un petit cas de de il qui reproduit les erreurs. En attendant, je ne sais pas mettre inclure des fichiers sur le dessus de la rpc fichier permettrait de résoudre la référence directe problème. Je suppose que votre réponse va résoudre mon problème.
Ajout d'un diagramme. J'espère que ça aidera.
OriginalL'auteur wmac | 2012-06-11
Vous devez vous connecter pour publier un commentaire.
Je ne vois pas comment transférer les déclarations ne sont pas de travail pour vous. Il semble que vous besoin de quelque chose comme:
Monde.h:
De l'Agent.h:
World.cc:
Agent.cc:
Même si elle n'est pas requise par la langue, c'est une bonne pratique pour mettre toutes les inclut au début du fichier si quelqu'un à la lecture de votre code peut être rapidement informés de ses dépendances.
Est-il une solution si vous n'avez pas seulement des références, mais des cas réels de type A, Type B et vice-versa? Je reçois un "incomplète de type" erreur de la part du compilateur, qui fait sens. Mais est-il un moyen de contourner cela?
si l'absurdité totale d'avoir une
A
dans unB
et unB
dans unA
n'est pas évident, asseyez-vous et essayer de travailler sur ce qu'une telle chose de la mémoire mise en page pourrait ressembler.OriginalL'auteur Mike DeSimone
Vous peut résoudre le problème uniquement avec sa déclaration, mais vous n'avez probablement pas séparer la mise en œuvre de la déclaration de la classe.
Si vous avez besoin d'appeler des méthodes de la classe, un type complet est nécessaire, qui est pourquoi vous devez inclure le fichier. Vous pouvez inclure le fichier dans un
cpp
(mise en œuvre de fichier) sans se soucier des dépendances circulaires.OriginalL'auteur Luchian Grigore