Frage bezüglich Klassen
-
Das mag jetzt zwar ein wenig blöd klingen, aber ich habe eine Fragen zu etwas, was funktioniert, ich aber nicht genau weiss, warum es so funktioniert. Ich habe zwei Klassen, wovon eine von der anderen erbt. Nun wollte ich durch die erste Klasse auf die Funktionen der zweiten direkt zugreifen. Das Problem habe ich wie folgt gelöst:
class Main { public: Main(); ~Main(); class EineKlasse* MeineKlasse; //warum geht das? void blabla (); }; class EineKlasse : public Main { public: EineKlasse(); ~EineKlasse(); void asdasdasd (); }; void Main::blabla () { MeineKlasse->asdasdasd(); } Main MainKlasse; void Mainfunktion () { MainKlasse.blabla(); }Das ist jetzt nur ein Beispiel. Jetzt ist meine Frage, warum man "class EineKlasse MeineKlasse;"* benutzen kann. Ich hatte das mal in einem anderen Projekt gesehen und es in diesem Projekt einfach übernommen und es scheint ohen Probleme zu laufen. Ich bin relativ neu, was die Verwendung von Klassen angeht und durch Suchen bei Google habe ich zu diesem speziellen Fall nichts gefunden. Wäre nett, wenn es mir jemand kurz erklären könnte und falls es eine bessere Lösung für das Problem gibt, diese auch zu posten.
-
FondoSin schrieb:
Das mag jetzt zwar ein wenig blöd klingen, aber ich habe eine Fragen zu etwas, was funktioniert, ich aber nicht genau weiss, warum es so funktioniert.
Das ist gar nicht so unüblich...

FondoSin schrieb:
Jetzt ist meine Frage, warum man "class EineKlasse MeineKlasse;"* benutzen kann. [...] Wäre nett, wenn es mir jemand kurz erklären könnte und falls es eine bessere Lösung für das Problem gibt, diese auch zu posten.
Da du das
class-Schlüsselwort direkt davor schreibst, weiss der Compiler, dass eine Klasse namensEineKlasseexistiert. Besser ist allerdings, du machst eine Vorwärtsdeklaration, denn bei Typen schreibt man normalerweise keinclassoderstructhin.class EineKlasse; // Vorwärtsdeklaration class Main { EineKlasse* MeineKlasse; };Falls du damit meinst, warum du einen Zeiger auf eine abgeleitete Klasse haben kannst: Das geht, weil Zeiger und Referenzen nur Verweise auf andere Objekte sind. Die Basisklasse enthält also kein Objekt der abgeleiteten Klasse, sondern nur einen Zeiger darauf. Das Objekt dahinter selber befindet sich sonst irgendwo (wenn es eines gibt).
Deine
Mainfunktion()hat aber hoffentlich eine andere Signatur?
-
Vielen Dank für die Antwort. Mir hat der Begriff "Vorwärtsdeklaration" gefeht. Der Code ist umgeschrieben und funktioniert weiterhin ohne Probleme.
Deine Mainfunktion() hat aber hoffentlich eine andere Signatur?
Das war, wie gesagt, nur ein Beispiel, damit es nicht zu komplex wird

-
FondoSin schrieb:
Das war, wie gesagt, nur ein Beispiel, damit es nicht zu komplex wird

Ich meint mehr die Signatur selber als den Inhalt (zudem wollte ich auch auf
voidanspielen)...
Wie auch immer, die
main()-Funktion muss standardmässig so aussehen:int main(); // oder int main(int argc, char** argv);
-
Das ist mir schon klar, ich programmiere ja nun nicht erst seit vorgestern. Die oben genannten Funktions -und Klassennamen habe ich mir nur der Übersicht wegen ausgedacht, sie haben überhaupt nichts mit meinem Projekt (DLL) zu tun.
-
Nimm Linux. http://kde.org/