www.mikrocontroller.net

Forum: PC-Programmierung C++ Programmieren


Autor: Koloso (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
new = malloc für Objekte, mit Konstruktoraufruf.

Autor: Random ... (thorstendb) Benutzerseite
Datum:

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

Autor: Andre R. (ryan87)
Datum:

Bewertung
0 lesenswert
nicht 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:
delete &mp1;
Auch nicht wirklich schön. Hast du das aus einem Buch für 
Information-Hiding? :]

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Koloso (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Koloso (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Daniel (root) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Koloso (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.