Forum: PC-Programmierung C++ Programmieren


von Koloso (Gast)


Lesenswert?

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?

von Random .. (thorstendb) Benutzerseite


Lesenswert?

new = malloc für Objekte, mit Konstruktoraufruf.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

sorry, hab das * überlesen.
Irgendwie sieht mir das nicht richtig aus ... sieht aus wie ein "halber" 
cast :-)

von Andre R. (ryan87)


Lesenswert?

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? :]

von Karl H. (kbuchegg)


Lesenswert?

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.

von Koloso (Gast)


Lesenswert?

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

von Koloso (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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?

von Daniel (root) (Gast)


Lesenswert?

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

von Koloso (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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
Noch kein Account? Hier anmelden.