Programmcode C++
-
Guten Tag,
ich habe hier ein kleines Verständnisproblem mit dem Programmcode. Ich weiß was als Ausgabe rauskommt, aber ich würde gerne wissen, was im main() zeile für zeile passiert. Könntet ihr mir für jede Zeile ein Kommentar abgeben? Wäre sehr nett von euch. Danke im voraus.

#include <iostream.h> class X { private: char* s; public: X(char *p) { s = p;} ; virtual void print() { cout << s ; } } ; class Y : public X { private: int n ; public: Y(char* p, int i) : X(p) {n = i ; }; void inc() { n++ ; } ; virtual void print() {X::print() ; cout << " " << n ; } ; } ; int main() { X** a = new X*[10] ; a[0] = new X("Meier") ; Y* y = new Y("Jakobsen", 24) ; a[1] = y; X* x = (X*) a[1] ; a[2] = x ; Y z = *y ; a[3] = &z ; y->inc() ; for ( int i=0 ; i<4 ; i++) { a[i]->print() ; cout << endl ; } ; }Die Ausgabe lautet:
Meier
Jakobsen 25
Jakobsen 25
Jakobsen 24
-
Wo hast du denn das grausame Stück Code her?
-
Ist eins zu eins aus einer alten Klausur. Als ich es compilieren wollte hat der compiler immer gemeckert!
-
Ich habe mal versucht, es verständlich zu erläutern. Ist nicht wirklich übersichtlich geworden...
int main() { X** a = new X*[10]; // a ist Zeiger auf einen Array von 10 Zeigern auf X a[0] = new X("Meier"); // Eine neue Instanz von X wird erstellt und deren Adresse im ersten Index von a gespeichert Y* y = new Y("Jakobsen", 24); // Ein Zeiger auf ein Y wird erstellt, dabei wird der gegebene Konstruktor verwendet a[1] = y; // Der vorher erstellte Zeiger auf Y wird im zweiten Index auf A gespeichert X* x = (X*) a[1] ; // a[1], welches einen Zeiger auf ein Y enthält, wird auf einen Zeiger auf ein X konvertiert, die Zeiger zeigen also auf das selbe Objekt // man hätte hier auch einfach X* x = a[1] schreiben können, da lediglich ein Zeiger auf das Unterobjekt X von Y übergeben wird a[2] = x ; // Ergebnis der Konvertierung wird in a[2] gespeichert Y z = *y ; // Das Objekt z wird mit einer Kopie des Objekts auf das y zeigt initialisiert a[3] = &z ; // a[3] wird die Adresse von z übergeben y->inc() ; // die Funktion inc() wird über das Objekt, auf das y zeigt aufgerufen for ( int i=0 ; i<4 ; i++) { a[i]->print() ; cout << endl ; } ; // --------- Schleife aufgeschlüsselt ------------------ // a[0]->print(): a[0] ist ein Zeiger auf ein X, das mit "Meier" initialisiert wurde, es wird also "Meier" ausgegeben // a[1]->print(): a[1] ist ein Zeiger auf ein Y, das mit "Jakobsen" und 24 initialisiert wurde // durch den Aufruf y->inc() wird 24 zu 25, es wird also "Jakobsen 25" ausgegeben // a[2]->print(): a[2] ist ein Zeiger auf ein X, welches aber "eigentlich" das Y aus a[1] war, also wird wegen Polymorphie Y::print() aufgerufen // mit dem Ergebnis das "Jakobsen 25" ausgegeben wird // a[3]->print(): a[3] wurde mit einer Kopie des Objektes, auf das y zeigt, initialisiert, bevor y->int() aufgerufen wurde, es wird deswegen // noch "Jakobsen 24" ausgegeben }Als ich es compilieren wollte hat der compiler immer gemeckert!
Das Problem ist nur, dass "cout" verwendet wird, ohne vorher "using namespace std;" zu schreiben.
Ich hoffe es hilft.
-
... schrieb:
Als ich es compilieren wollte hat der compiler immer gemeckert!
Das Problem ist nur, dass "cout" verwendet wird, ohne vorher "using namespace std;" zu schreiben.
Ich hoffe es hilft.
Das Problem ist eher dass iostream.h veraltet ist - den gibt es nimmer! Das heißt jetzt nur iostream, und dann gibts auch den namespace std.
-
Das Problem ist nur, dass "cout" verwendet wird, ohne vorher "using namespace std;" zu schreiben.
Da er den veralteten Header <iostream**.h**> verwendet macht das nichts. Zweimal falsch ist in diesem Fall gleich richtig.
-
danke an euch alle

-
Haki schrieb:
Ist eins zu eins aus einer alten Klausur. Als ich es compilieren wollte hat der compiler immer gemeckert!
- Sind denn neuere Klausuren immer noch in dem Stil? Hast du da ein paar Beispiele?
Das ist ja wie gesagt grausam...
* Polymorphe Objekte über Basisklassenzeiger verwalten, ohne virtuellem Destruktor.
* Kein Kopierkonstruktor/Zuweisungsoperator trotz Member als Zeiger.
* ein char* mit einem const char* initialisieren (nur Zeigerübergabe). Versuch mal einen einzelnen char zu verändern:
class X { /// code void fail() { s[0] = 's'; } };Das gibt nen fetten Segfault!
* Adresse auf ein temporäres Objekt in einem Array speichern...
* usw.Wenn die alle so sind, würd ich mir nen anderen Kurs suchen
(geht wohl eher schlecht...)- Wenn du einen Fehler bekommst und damit nichts anfangen kannst poste den das nächste mal bitte mit, hier können die meisten was damit anfangen

- Sind denn neuere Klausuren immer noch in dem Stil? Hast du da ein paar Beispiele?
-
leider habe ich keine beispiele mehr.
so wie ich gehört habe hat sich das programmcodebeispiel auch geändert. zum glück auch
!!!
ich werde versuchen demnächst das berichtigte programmcode zu compilieren und dann nochmal hier posten