C++, zwei Klassen mit gegenseitigen Bedürfnisse
Habe ich Umgerechnet eine wissenschaftliche simulation Plattform von Java in C++. Ich habe versucht, das design so weit wie möglich die gleichen wie die Vorherige Implementierung. In java wegen der späten Bindung, zirkuläre Abhängigkeiten sind gelöst, an der Laufzeit. Jedoch zirkuläre Abhängigkeiten geschaffen haben, der eine Hölle von einem Schlamassel in C++.
- Ist es ein automatisiertes tool, das Analysen und Listen das Rundschreiben enthält und Referenzen? (Nur Visual Studio 2010 gibt eine riesige Liste von nonsense-Fehler).
- Habe ich versucht, vorwärts-Verweise, wo immer möglich. Allerdings in einigen Fällen beide Klassen benötigen die Funktionalität der anderen Klasse (d.h. Aufruf von Methoden, die es unmöglich macht zu nutzen, forward reference). Diese Bedürfnisse existieren in Logic, und wenn ich radikal das design ändern, werden Sie nicht mehr als echte Welt-Interaktionen.
Wie könnten wir implementieren zwei Klassen, die einander brauchen die Methoden und status? Ist es möglich, implementieren Sie in C++?
Beispiele:
- Beispiel 1: ich habe eine Klasse namens "Welt", die erzeugt Objekte des Typs "Agent". Agent aufrufen muss, Welt Methoden, um Informationen aus seiner Umwelt. Welt auch braucht, um Durchlaufen die Agenten und führen Sie Ihre "run" - Methode und bekommen Ihren status (status-updates, die möglicherweise sein durchgeführt Rückseite zu lösen in diesem Abschnitt das problem aber nicht die run-Methode).
- Beispiel 2: Agenten erstellen eine Sammlung von Ihre "Absichten". Jeder Agent muss zu Durchlaufen, seine Absichten und run/update/read Absicht status. Absichten müssen auch Informationen über die Umwelt durch den Agenten (wenn man es direkt über die "Welt" wird es schaffen, komplexe Kreise wieder) und auch Informationen von den Agenten selbst.
Unten Diagramm zeigt eine sub-Klassen, und einige Ihrer Methoden und Eigenschaften:
Wenn Sie Probleme mit Fehler, können Sie immer eine Frage stellen mit diesen Fehlern (wörtlich bitte) und jemand wird wahrscheinlich in der Lage sein, um Ihnen zu helfen. Auch diese Fehler können Unsinn Sie, aber nicht zu jemand anderem. Es ist auch sehr schwer, Fragen zu beantworten, ohne zu sehen, einen code, und ich empfehle Sie Lesen Sie die sscce.org.
Joachim, Sie sind die Art von Fehler, die generiert werden, in die zirkuläre Abhängigkeit Fällen. Klassen können nicht identifiziert werden.
Die Buchung der code ist viel mehr als hilfreich, die Buchung der Fehler. Posting beide am besten ist.
Mike, der code ist in der Nähe von 50.000 Zeilen code. Ich schneiden müssen und bauen einen kleinen Fall aus, die reproduziert den Fehler. Mittlerweile wusste ich nicht setzen, gehören Dateien über die cpp-Datei würde lösen der vorwärts-Referenz-problem. Ich denke mal, deine Antwort mein problem lösen wird.
Hinzugefügt, Diagramm. Ich hoffe, es wird helfen.
Joachim, Sie sind die Art von Fehler, die generiert werden, in die zirkuläre Abhängigkeit Fällen. Klassen können nicht identifiziert werden.
code
1>e:\programming\cprojt\actiondb11\actiondb\base\world.h(35): Fehler B. c2143: Syntaxfehler : fehlendes ',' vor '*' 1>e:\programming\cprojt\actiondb11\actiondb\base\world.h(36): error C2061: Syntaxfehler : Bezeichner 'Agent' 1>e:\programming\cprojt\actiondb11\actiondb\base\world.h(50): error C2065: 'Agent' : nicht deklarierter BezeichnerDie Buchung der code ist viel mehr als hilfreich, die Buchung der Fehler. Posting beide am besten ist.
Mike, der code ist in der Nähe von 50.000 Zeilen code. Ich schneiden müssen und bauen einen kleinen Fall aus, die reproduziert den Fehler. Mittlerweile wusste ich nicht setzen, gehören Dateien über die cpp-Datei würde lösen der vorwärts-Referenz-problem. Ich denke mal, deine Antwort mein problem lösen wird.
Hinzugefügt, Diagramm. Ich hoffe, es wird helfen.
InformationsquelleAutor wmac | 2012-06-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin nicht zu sehen, wie forward-Deklarationen sind nicht für Sie arbeiten. Es sieht aus wie Sie brauchen so etwas wie:
Welt.h:
Agent.h:
World.cc:
Agent.cc:
Obwohl es nicht erforderlich ist, durch die Sprache, es ist gute Praxis, um alle gehören an den Anfang der Datei, damit jemand das Lesen kann Ihr code schnell kennen deren Abhängigkeiten.
Gibt es eine Lösung, wenn man nicht nur Verweise, sondern die tatsächlichen Instanzen von Typ A in Typ B und Umgekehrt? Ich bekomme ein "unvollständiger Typ" Fehlermeldung vom compiler, was Sinn macht. Aber gibt es eine Möglichkeit, um es?
wenn Sie die völlige Absurdität, dass ein
A
imB
und einB
in einemA
nicht offensichtlich ist, sich hinsetzen und versuchen Sie herauszufinden, wozu so eine Sache memory layout Aussehen würde.InformationsquelleAutor Mike DeSimone
Du kann lösen das problem nur mit forward declarations, aber Sie wußte wohl nicht, trennen Sie die Implementierung aus der Deklaration der Klasse.
Wenn Sie brauchen, um Methoden aufzurufen, die von der Klasse, ein full-Typ benötigt wird, das ist, warum Sie benötigen, um zu schließen Sie die Datei. Sie können die Datei in einem
cpp
(Implementierungsdatei), ohne sich Gedanken über zirkuläre Abhängigkeiten.InformationsquelleAutor Luchian Grigore