Was bedeutet B &b = *new B;
-
Hallo,
was bedeutet
B &b = *new B;B ist ein struct. Ein Zeiger wird auf eine Adresse zugewiesen? Sorry, es ist eine Anfängerfrage aber auch ziemlich verwirrend, wenn man davor nur in Java programmiert hat.
Gibt es eventuell eine Seite, wo alle möglichen Zuweisungen zwischen Adressen, Zeigern usw. verständlich erklärt sind?Grüße
Markus
-
Damit wird eine Referenz angelegt. Eine Referenz hat den Vorteil, dass sie immer gültig ist. Da new auch fehlschlagen kann, ist das nicht ganz so geschickt. Außerdem ist damit nicht mehr sofort zu erkennen, dass es sich um dynamischen Speicher handelt, der auch mit delete wieder freigeben werden muss.
Besser ist daher:
B *b = new B;
-
Vielen Dank aber wieso ruft
B b;in diesem Beispiel zwei mal den Konstruktur A auf?
#include <iostream> struct A { A() { std::cout << "Konstruktor A\n"; } ~A() { std::cout << "Destruktor A\n"; } void funk1() { std::cout << "funkA1\n"; } virtual void funk() { std::cout << "funkA\n"; } } a; struct B : public A { B() { std::cout << "Konstruktor B\n"; } ~B() { std::cout << "Destruktor B\n"; } virtual void funk() { std::cout << "funkB\n"; } virtual void funk1() { std::cout << "funkB1\n"; } }; int main() { B b; //B &b = *new B; a.funk1(); a.funk(); b.funk1(); b.funk(); A *p = &a; p->funk(); p->funk1(); p = &b; p->funk(); p->funk1(); }
-
Einmal Zeile 15 (globales Objekt a) und einmal Zeile 33 ("B b;").
B erbt von A. Wenn ein Objekt vom Typ B erstellt wird, wird zuerst der Konstruktor von A aufgerufen, dann der von B.
-
Vielen Dank!
-
Upsi, da ist mir direkt ein dummer Fehler unterlaufen.
@trollfeed: Entschuldige dass dein Post verschwunden ist, das war reines Versehen.
-
jhkhjkhjk schrieb:
Da new auch fehlschlagen kann, ist das nicht ganz so geschickt.
Warum?
Außerdem ist damit nicht mehr sofort zu erkennen, dass es sich um dynamischen Speicher handelt, der auch mit delete wieder freigeben werden muss.
Besser ist daher:
B *b = new B;Noch besser wäre ein unique_ptr, dann muss sich niemand mehr um das Freigeben kümmern.
-
Nur weil das noch niemand so deutlich gesagt hat: Sowas wie B &b = *new B; tut man nicht. Es ist vergleichbar mit einem Auto, wo der Rückwärtsgang vorwärts fährt. Allgemein sollte Code kein new enthalten, außer in der Eigenimplementation von make_unique.
-
Ich kenne die vom threadsteller beschriebene Syntax gar nich! Nur aus Neugierde, Was genau ist der Unterschied zwischen dem was ich kenne:
Foo *p= new Foo();
Und
Foo &p = *new Foo();
..?
Gruesse und danke
-
Du kennst
int var; int* pointer = &var; int& reference = *pointer;nicht? Das ist nichts anderes.
-
NullBockException schrieb:
Foo &p = *new Foo();
Niemand mit einem Rest Verstand macht das.
Manuelle Speicherverwaltung ist sowieso schon fragwürdig genug, dafür gibts automatische Objekte und Smart-Pointer.