Gibt es sowieso ein Objekt einer Klasse zu deklarieren, bevor die Klasse in C++ erstellt wird? Ich frage, weil ich versuche, zwei Klassen zu verwenden, die erste muss eine Instanz der zweiten Klasse enthalten, aber die zweite Klasse enthält auch eine Instanz der ersten Klasse. Ich weiß, dass Sie vielleicht denken, ich könnte in eine Endlosschleife geraten, aber ich muss tatsächlich die zweite Klasse vor der ersten Klasse erstellen und instanzieren.Deklarieren Sie ein Objekt, noch bevor diese Klasse erstellt wird
Antwort
Sie können etwas tun:
class A {
B b;
};
class B {
A a;
};
Das offensichtlichste Problem ist der Compiler nicht weiß, wie zu groß es braucht Klasse A zu machen, weil die Größe von B hängt von der Größe von A!
können Sie aber dies tun:
class B; // this is a "forward declaration"
class A {
B *b;
};
class B {
A a;
};
Deklarieren der Klasse B als eine Vorwärts-Deklaration können Sie Zeiger verwenden (und Verweise) zu dieser Klasse, ohne noch die ganze Klassendefinition hat.
Sie können keine Instanz einer undefinierten Klasse deklarieren Sie können jedoch einen Zeiger einem erklären:
class A; // Declare that we have a class A without defining it yet.
class B
{
public:
A *itemA;
};
class A
{
public:
B *itemB;
};
Ist das nah an, was Sie wollen: Die erste Klasse, die zweite Klasse enthält, aber die zweite Klasse (die zuerst erstellt werden soll) hat nur einen Verweis auf die erste Klasse?
Ich versuche tatsächlich das Gegenteil zu tun, wobei die erste Klasse die zweite Klasse referenziert und die zweite Klasse eine Instanz der ersten Klasse enthält. –
Dies wird als Querverweis bezeichnet. Siehe here ein Beispiel.
Es gibt an elegant solution mit Vorlagen.
template< int T > class BaseTemplate {}; typedef BaseTemplate<0> A; typedef BaseTemplate<1> B; // A template<> class BaseTemplate<0> { public: BaseTemplate() {} // A constructor B getB(); } // B template<> class BaseTemplate<1> { public: BaseTemplate() {} // B constructor A getA(); } inline B A::getB() { return A(); } inline A B::getA() { return B(); }
Dieser Code wird funktionieren! Also, warum funktioniert es ? Der Grund hat damit zu tun, wie Vorlagen kompiliert werden. Vorlagen verzögern die Erstellung der Funktion Signaturen, bis Sie tatsächlich die Vorlage irgendwo verwenden. Das bedeutet, dass weder getA() noch getB() ihre Signaturen analysiert haben, bis nach beide Klassen A und B bereits vollständig deklariert wurden. Das ist die Magie von diese Methode.
Interessant (obwohl es mehrere Tippfehler enthält). Aber die "getA" und "getB" sind wirklich Fabriken: Sie geben neue Instanzen (nach Wert) zurück. Eine Instanz von A hat keine-A B noch hat eine Instanz von B-eine A. – jwfearn
- 1. Exemplarisches Objekt einer Klasse, bevor main() ausgeführt wird
- 2. Objekt - ein Objekt aufrufen, bevor es definiert wird
- 3. Wann wird ein Objekt in Javascript erstellt?
- 4. Was ist zu beachten, bevor ein Index erstellt wird?
- 5. Was passiert, wenn wir ein Objekt deklarieren und zuweisen auf ein anderes Objekt der gleichen Klasse
- 6. Deklarieren Sie ein Dictionary in einer statischen Klasse
- 7. Best Practice beim Hochladen von Dateien, bevor das Objekt erstellt wird?
- 8. Können Sie ein Attribut private innerhalb einer abstrakten Klasse deklarieren?
- 9. Wie erstellt man eine Fallklasse für diese json-Eingabe und konvertiert sie in ein Objekt?
- 10. Jquery wählen Sie diese + Klasse
- 11. Bilddaten noch dort, obwohl es gelöscht wird, bevor das Formular
- 12. Eigenschaft als Objekt deklarieren?
- 13. Wie definiert man eine PHP-Variable als spezifischen Klassentyp, bevor ein Objekt instanziiert wird?
- 14. Ist diese Klasse ein POJO
- 15. Wie erstellt man eine Klasse und ein Objekt in Jsp?
- 16. JAXB Unmarshall Erstellt ein leeres Objekt
- 17. Ist es noch notwendig, ein Leerzeichen einzufügen, bevor ein leeres Element in XHTML geschlossen wird?
- 18. Warum überprüfen Sie, ob eine Klassenvariable null ist, bevor Sie ein neues Objekt im Konstruktor instanziieren?
- 19. Wie erstellt man ein Objekt in MongoDB
- 20. Deklarieren einer Klasse als ein Mitglied von ihr
- 21. wie ein Objekt aus einer anderen Klasse in Java erstellt und verwendet wird
- 22. Wie wird ein Canvas-Objekt erstellt, indem Canvas-Konstruktor mit Argumenten in Java aufgerufen wird?
- 23. Java GC Frage: Wie kann ein Objekt unerreichbar werden, während eine seiner Methoden noch ausgeführt wird?
- 24. Wird beim Iterieren eines String Slice ein neues Objekt erstellt?
- 25. Testen, ob ein Objekt von current_user gehört oder erstellt wird
- 26. Wie erstellt man ein ArrayList-Objekt in einer benutzerdefinierten Java-Klasse in Kettle?
- 27. Was sollte ein Entwickler wissen, bevor er mobile Apps erstellt?
- 28. Instanziieren Sie ein Objekt aus einer dynamisch generierten Klasse
- 29. Warum diese CircleTest-Klasse nicht kompiliert wird
- 30. ein Objekt aus einer untergeordneten Klasse
... oder eine Referenz auf eins: MyClass & rMyObject; –