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?
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.