Maxim S. schrieb:
> Erzeuge ich hierbei zweimal ein Objekt der Klasse B?
Ja, natürlich.
Das erste B-Objekt wird erzeugt, wenn das A-Objekt erzeugt wird, weil ja
jedes A Objekt einen B-Member hat. Und diesen B-Member muss es bereits
haben, wenn der Funktionskörper des Konstruktors beginnt loszulaufen.
Im Konstruktor tauscht du dann diese Default-erzeugte Objekt gegen ein
neues aus. Und dabei wird natürlich das zuerst erzeugte Objekt zerstört.
> Ich hatte naemlich
> Probleme mit dem Destruktor, der offensichtlich etwas zerstoeren wollte,
> was nicht da war. B legt intern einige Objekte nur an, wenn ein
> Konstruktor mit Parametern aufgerufen wird. Geloest habe ich es dadurch,
> dass ich in A nur einen Zeiger auf ein Objekt der Klasse B definiert und
> im Konstruktor von A dann
>
>
>
> verwendet habe.
Keine gute Idee.
Du solltest ernsthaft den Ankauf und das Durcharbeiten eines C++ Buchs
in Erwägung ziehen! Und das meine ich nicht als Scherz oder weil ich
dich ärgern will.
Sowas macht man mit einer Initializer List im Konstruktor ...
1 | class A
|
2 | {
|
3 | public:
|
4 | A();
|
5 | ~A();
|
6 |
|
7 | B b;
|
8 | };
|
9 |
|
10 | A::A() : b( 7 )
|
11 | {
|
12 | }
|
... in der festgelegt wird, auf welche Art und Weise der B-Member des
A-Objektes zu erzeugen ist.
Wie willst du denn C++ programmieren, wenn du die Hälfte deines
Werkzeugkastens gar nicht kennst?
> Geloest habe ich es dadurch,
> dass ich in A nur einen Zeiger auf ein Objekt der Klasse B definiert
> und im Konstruktor von A dann
> b = new B(7);
>
> verwendet habe.
Das kann man so machen, manchmal muss man es so machen, aber wenn irgend
möglich, willst du es ohne erzwungenen Grund nicht so machen. Bis jetzt
seh ich noch nichts, was diesen Weg erzwingen würde.
Grund: dynamische Allokierung erfordert bei einer sauber allokierten
Klasse einen Destruktor, einen Copy Contruktor und einen
Zuweisungsoperator. Auch bekannt als die 'Rule of three': Musst du eine
der 3 selbst implementieren - Destruktor, Copy Constructor, Assigment
operator - ist es sehr wahrscheinlich, dass du alle 3 implementieren
musst.