Forum: PC-Programmierung Konstruktor


von Anfänger (Gast)


Lesenswert?

Ich hab hier ein kleines Progrämmchen. Da verstehe ich halt nicht, warum 
der Konstruktor so ist? Könnte mir einer erklären warum?
Danke im voraus!!!!
1
classe auto:
2
{
3
 private:
4
5
 public:
6
  auto(int anzahl);
7
  ~auto();
8
}
9
10
classe fahrzeuge: public auto
11
{
12
 private:
13
14
 public:
15
  fahrzeuge(int anzahl);
16
  ~fahrzeuge();
17
}
18
19
/*** Programmdatei fahrzeuge.cpp ***/
20
fahrzeuge::fahrzeuge(int anzahl): auto(anzahl)
21
{
22
 ....
23
 ....
24
}

von Anfänger (Gast)


Lesenswert?

Hab noch ein weiteres Verständnisproblem.
Whier wird doch zuerst ein globaler Zeiger auf das Objekt Auto angelegt 
oder?
Das im Konstruktoraufruf verstehe ich nicht. Warum x 0 this?

auto* x=NULL;  // globaler Zeiger auf die Instanz der Klasse COM

auto::auto(int anzahl)
{
 ...
 x = this;
 ...
}



von Anfänger (Gast)


Lesenswert?

hab mich verschrieben. So muss es heissen: Warum x = this?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> classe auto:
> ...
> classe fahrzeuge: public auto
> ...

http://de.wikibooks.org/wiki/C++-Programmierung:_Vererbung#Grundlagen

> fahrzeuge::fahrzeuge(int anzahl): auto(anzahl)

http://de.wikibooks.org/wiki/C++-Programmierung:_Vererbung#Konstruktoren_und_Destruktoren

> Warum x = this?

Beitrag "this - Zeiger"

von Rolf Magnus (Gast)


Lesenswert?

Deine Codeschnipsel enthalten ziemlich viele Fehler und gehen so gar 
nicht durch einen Compiler.

> Da verstehe ich halt nicht, warum der Konstruktor so ist?

Was meinst du mit "so"?

> Könnte mir einer erklären warum?

Nur wenn du genauer beschreibst, was dir nicht klar ist. Sonst müßte man 
ziemlich weit ausholen.

> Whier wird doch zuerst ein globaler Zeiger auf das Objekt Auto angelegt
> oder?

Kommt drauf an, wo das steht. Auto ist auch kein Objekt, sondern eine 
Klasse (im Code heißt sie allerdings 'auto', was nicht möglich ist, weil 
das ein Schlüsselwort ist).

> Das im Konstruktoraufruf verstehe ich nicht. Warum x 0 this?

Keine Ahnung. Das ist ziemlich wirr. Wo hast du den Code her?

> auto* x=NULL;  // globaler Zeiger auf die Instanz der Klasse COM
>
> auto::auto(int anzahl)
> {
>  ...
>  x = this;
>  ...
> }

Damit zeigt der globale Zeiger x immer auf das zuletzt erzeugte Auto.

von Anfänger (Gast)


Lesenswert?

1
classe auto:
2
{
3
 private:
4
5
 public:
6
  auto(int anzahl); // Konstruktor
7
  ~auto();          // Destruktor
8
}
9
10
// abgeleitete Klasse fahrzeuge
11
classe fahrzeuge: public auto
12
{
13
 private:
14
15
 public:
16
  fahrzeuge(int anzahl); // Konstruktor
17
  ~fahrzeuge();          // Destruktor
18
}
19
20
/*** Programmdatei fahrzeuge.cpp ***/
21
fahrzeuge::fahrzeuge(int anzahl): auto(anzahl) //Definition des Kontruktors
22
{
23
 ....
24
 ....
25
}
26
27
/*** Programmdatei auto.cpp ***/
28
auto* x=NULL;  // globaler Zeiger auf die Instanz der Klasse auto
29
30
auto::auto(int anzahl) // Definition des Konstruktors
31
{
32
 ...
33
 x = this;
34
 ...
35
}

Im Prinzip soll das so sein, dass wenn ich den Kontruktor von der Klasse 
fahrzeuge aufrufe, dann soll der Kontruktor von der Klasse auto 
ausgeführt werden. --> kaskadierter Kontruktor

von Rolf Magnus (Gast)


Lesenswert?

> wenn ich den Kontruktor von der Klasse fahrzeuge aufrufe, dann soll der
> Kontruktor von der Klasse auto ausgeführt werden.

Das ist doch genau das, was du schon tust. Wo liegt jetzt das Problem?

Und nochmal: 'auto' kannst du in C++ als Klassenname (bzw allgemein als 
Name) nicht verwenden. Ein paar weitere Fehler: Das Schlüsselwort zur 
Klassendefinition heißt 'class', nicht 'classe'. Am Ende einer 
Klassendefinition muß ein Semikolon stehen. Der Doppelpunkt in der 
ersten Zeile der Definition von 'auto' muß entfernt werden.


von Anfänger (Gast)


Lesenswert?

ja ich möchte wissen ob das stimmt was ich hier geschrieben habe.
kann man hier dann von einem kaskadiertem Kontruktur reden?
Mit x = this , tue ich den this Zeiger dem globalen Zeiger x zuweisen.
Damit kann ich dann auf die Methoden einer Funktion die nicht Mitglied 
in fahrzeuge und auto ist zugreifen.

von Karl H. (kbuchegg)


Lesenswert?

Anfänger wrote:
> ja ich möchte wissen ob das stimmt was ich hier geschrieben habe.
> kann man hier dann von einem kaskadiertem Kontruktur reden?

Den Begriff 'kaskadierter Konstruktor' hab ich zwar noch nie
gehört, aber ja, ich denke das könnte man so sagen.

Wenn ein Fahrzeuge Objekt erzeugt wird, muss ja auch ein
Auto Objekt erzeugt werden. Die deshalb, weil ja
durch die Vererbung

  class Fahrzeuge : public Auto
  {
    ...
  };

festgelegt wurde, dass ein Fahrzeug ein Auto ist

(Und an dieser Stelle solltest du nochmal über die
 Vererbungshierarachie nachdenken:
 Ist es wirklich so, dass jedes Fahrzeug automatisch ein Auto
 ist, oder ist es nicht vielmehr so, dass jedes Auto auch
 automatisch ein Fahrzeug ist

 Eine public-Vererbung kann immer als 'ist-ein' gesprochen
 werden

   class Auto : public Fahrzeug
   heist also: Ein Auto 'ist-ein' Fahrzeug

   class Fahrzeug : public Auto
   würde heissen: Ein Fahrzeug 'ist-ein' Auto
)

Nun hat aber ein Auto keinen Default-Konstruktor, daher
muss beim Konstruktor für Fahrzeug angegeben werden, welcher
Konstruktor von Auto benutzt werden soll (es könnte ja mehrere
geben)

Fahrzeuge::Fahrzeuge(int anzahl): Auto(anzahl)

und da dieser Auto Konstruktor ein Argument haben möchte,
muss man ihm dieses auch mitgeben.

Das ganze nennt sich übrigens 'initializer list':
Nach der 'Funktionsdefinition' des Konstruktors kann
ein : folgen und auf diesen : folgen alle Initialisierungen,
die gemacht werden sollen. Dazu gehört auch eine mögliche
Angabe, wie die Initialisierung der Basisklasse durchgeführt
werden soll, sprich welcher Konstruktor aufgerufen werden
soll und welche Argumente er erhalten soll.

Um das mit den 'initializer list's noch zu vertiefen.

Du hättest auch schreiben können

class auto
{
  public:
    auto( int anzahl );

  private:
    int anzahl_raeder;
};

auto::auto(int anzahl) : anzahl_raeder(anzahl)
{
 ...
}

anzahl_raeder wird also mit dem übergebenen Parameter anzahl
initialisiert. In dem Fall gibt es keinen Unterschied zu

auto::auto(int anzahl)
{
  anzahl_raeder = anzahl;
}

es gibt aber sehr wohl Fälle, wo dieser Unterschied
(Initialisierung versus Zuweisung im Konstruktor)
eine entscheidenden Unterschied ausmacht.


> Mit x = this , tue ich den this Zeiger dem globalen Zeiger x zuweisen.

Ja.
Ist zwar nicht schön, kann man aber so machen.

> Damit kann ich dann auf die Methoden einer Funktion die nicht Mitglied
> in fahrzeuge und auto ist zugreifen.

? Den Satz versteh ich beim besten Willen nicht. Da ist nicht
erkennbar, welchen Sinn du rüber bringen möchtest.

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.