Bin ja gerade am lernen und hab mal wieder ne Frage? MarriedPerson &mp1 = *new MarriedPerson("Karl", 55, "Brigitte"); wird diese *new nur deswegen so gemacht weil die Referenz nur eine anfangsadresse bzw eine Variable aufnehmen kann?
sorry, hab das * überlesen. Irgendwie sieht mir das nicht richtig aus ... sieht aus wie ein "halber" cast :-)
Also ich programmier ja schon lange mit C++, aber sowas ist mir auch noch nie untergekommen. Mit dem * wird ja das Objekt angesprochen und mp1 ist dann eine Referenz darauf. Soweit so gut, da stellt sich mir nur die Frage warum man das machen sollte. Dadurch verlier ich doch alle Vorteile die mir durch Pointer gegeben sind. Und das Löschen dürfte dann so aussehen:
1 | delete &mp1; |
Auch nicht wirklich schön. Hast du das aus einem Buch für Information-Hiding? :]
Koloso schrieb: > Bin ja gerade am lernen und hab mal wieder ne Frage? > > MarriedPerson &mp1 = *new MarriedPerson("Karl", 55, "Brigitte"); > > wird diese *new nur deswegen so gemacht weil die Referenz nur eine > anfangsadresse bzw eine Variable aufnehmen kann? Wo hast du das gesehen, bzw. wer hat das geschrieben? Du machst jetzt Folgendes: Du gehst ins Badezimmer und holst einen Putzfetzen. So einen richtig schweren, mit dem deine Freundin, Frau, Mutter den Boden aufwischt. Den machst du dann so richtig nass und dann erschlägst du damit den Programmierer, der das verbrochen hat. Sowas macht man nicht! Aber um deine Frage zu klären. Eine Referenz ist ein anderer Name für ein ansonsten anderweitig existierendes Objekt. Diese Referenz hier ist eine Referenz zu einem MarriedPerson Objekt. Vom new kriegst du kein Objekt. Vom new kriegst du die Adresse zu einem Objekt. Eine Adresse (vulgo Pointer) muss man derferenzieren um an das Objekt zu kommen, dessen Adresse man hat. Daher wird der von new gelieferte Pointer dereferenziert um ein Objekt zu erhalten, von dem man dann eine Referenz erzeugen kann. Alles in allem: Eher sinnlos, um sich ein bischen Tipparbeit bei weiteren Zugriffen auf das Objekt zu ersparen. Dafür verschleiert man im Code komplett, dass dieses Objekt dynamisch angelegt wurde.
Das waren bzw sind die Übungsaufgaben ich denk das passt schon so. Wahrscheinlich soll man ja darüber ein wenig diskutieren Ich habs aber mal komplett anders gemacht und es geht auch anders
int main(void) { MarriedPerson &mp1 = *new MarriedPerson("Karl", 55, "Brigitte"); const Person *pFamily[] = { &mp1, new MarriedPerson("Brigitte", 51, "Karl"), new Person("Hans", 25), new Person("Hans", 2) }; int i; for (i = 0; i < ARRSIZE; i++) cout << "*pFamily[" << i <<"] = " << *pFamily[i]; // Test Kopier-Konstruktor MarriedPerson MarriedPerson mp2(mp1); cout << "mp2 = " << mp2; // Test Zuweisungsoperator MarriedPerson MarriedPerson mp3; mp3 = mp1; cout << "mp3 = " << mp3; // Test virtueller Destruktor for (i = 0; i < ARRSIZE; i++) delete pFamily[i]; cout << "Ende main()\n"; } das war die vorgegeben main und wirs müssen halt den rest programmieren
Koloso schrieb: > Das waren bzw sind die Übungsaufgaben ich denk das passt schon so. Als Übungsaufgabe ist das ok. Aber ich kann dich nur warnen. Setz so ein Konstrukt nicht in realem Code ein. Sowas ist eine Zeitbombe. > Ich habs aber mal komplett anders gemacht und es geht auch anders Natürlich gehts auch anders. Die Referenz ist an dieser Stelle völlig unnötig. Natürlich kommt es vor, dass man (meist unwissentlich) eine Referenz auf ein Objekt zu bilden hat, von dem man nur die Adresse hat. Aber in dieser konkreten Zusammenstellung, den von new gelieferten Pointer sofort zu dereferenzieren um die Referenz bilden zu können, ist das einfach nur Unfug.
Schau mal. Hier passiert im Grunde fast genau dasselbe ...... << *pFamily[i]; pFamily ist ein Array von Pointern. pFamily[i] ist ein Pointer aus dem Array. Und *pFamily[i] ist dann das Objekt auf das dieser eine Pointer zeigt.
Koloso schrieb:
> das war die vorgegeben main und wirs müssen halt den rest programmieren
Ich hoffe ihr benutzt std::string um die Namen zu speichern.
Sooo viel ist da ja nicht zu tun.
Wie du das hinkriegst, dass hier
for (i = 0; i < ARRSIZE; i++)
cout << "*pFamily[" << i <<"] = " << *pFamily[i];
die Ausgabefunktion von MarriedPerson bzw. Person, je nachdem worauf der
Pointer zeigt, aufgerufen wird, weißt du?
denn bedenke was passiert wenn es keinen Speicher mehr gibt 1) new wirft exception 2) new gibt 0 zurück (zb mit new (std::nothrow) Person ) Fall 1) unproblematisch Fall 2) null pointer Dereferenzierung => das war's
die Ausgabefunktion von MarriedPerson bzw. Person, je nachdem worauf der Pointer zeigt, aufgerufen wird, weißt du? mit ner globalen Operatorfunktion hab ich das gemacht einmal als friend und einmal nicht als friend deklariert das geht beides
Karl heinz Buchegger schrieb: > Koloso schrieb: >> Das waren bzw sind die Übungsaufgaben ich denk das passt schon so. > > Als Übungsaufgabe ist das ok. > Aber ich kann dich nur warnen. Setz so ein Konstrukt nicht in realem > Code ein. Sowas ist eine Zeitbombe. > ... Es ist in so einem kleinen Beispiel überflüssig, außer halt übungsmäßig zu zeigen, daß es geht. Ich gebe dir recht, daß man es im realen Leben zumindest nicht leichtfertig machen sollte. Aber ich würde nicht soweit gehen, es für immer und ewig zu verbieten. In der Tat muß man dann sorgfältig arbeiten, aber wenn man z.B. in einem ctor eine Referenz so setzt und im Destruktor wieder freigibt (und danach nicht mehr darauf zugreift natürlich), ist es m.E. durchaus legitim - und gelegentlich auch nötig. Ich hatte etwas ähnliches mal in einer eigenen Klasse für smart pointer gebraucht. In reiner Anwendungsprogrammierung wird man es eher kaum benötigen, zugegegeben.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.