mikrocontroller.net

Forum: PC-Programmierung Konstruktor


Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!!
classe auto:
{
 private:

 public:
  auto(int anzahl);
  ~auto();
}

classe fahrzeuge: public auto
{
 private:

 public:
  fahrzeuge(int anzahl);
  ~fahrzeuge();
}

/*** Programmdatei fahrzeuge.cpp ***/
fahrzeuge::fahrzeuge(int anzahl): auto(anzahl)
{
 ....
 ....
}

Autor: Anfänger (Gast)
Datum:

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



Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab mich verschrieben. So muss es heissen: Warum x = this?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> classe auto:
> ...
> classe fahrzeuge: public auto
> ...

http://de.wikibooks.org/wiki/C++-Programmierung:_V...

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

http://de.wikibooks.org/wiki/C++-Programmierung:_V...

> Warum x = this?

Beitrag "this - Zeiger"

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
classe auto:
{
 private:

 public:
  auto(int anzahl); // Konstruktor
  ~auto();          // Destruktor
}

// abgeleitete Klasse fahrzeuge
classe fahrzeuge: public auto
{
 private:

 public:
  fahrzeuge(int anzahl); // Konstruktor
  ~fahrzeuge();          // Destruktor
}

/*** Programmdatei fahrzeuge.cpp ***/
fahrzeuge::fahrzeuge(int anzahl): auto(anzahl) //Definition des Kontruktors
{
 ....
 ....
}

/*** Programmdatei auto.cpp ***/
auto* x=NULL;  // globaler Zeiger auf die Instanz der Klasse auto

auto::auto(int anzahl) // Definition des Konstruktors
{
 ...
 x = this;
 ...
}

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

Autor: Rolf Magnus (Gast)
Datum:

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


Autor: Anfänger (Gast)
Datum:

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

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

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

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.