Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » was macht Mammel() dann dort ?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
14.02.2006, 11:44 Uhr
ref



Wozu braucht man in diesem code Mammal() oder Mammal(age) in den markerten zeilen zu schreiben? die sind schon am anfang des codes deklariert, was dient die wiederholung?


C++:
// Listing 16.4 Konstruktoren in abgeleiteten Klassen überladen
#include <iostream>

enum BREED { YORKIE, CAIRN, DANDIE, SHETLAND, DOBERMAN, LAB };

class Mammal
{
public:
     // Konstruktoren
     Mammal();
     Mammal(int age);
     ~Mammal();

     // Zugriffsfunktionen
     int GetAge() const { return itsAge; }
     void SetAge(int age) { itsAge = age; }
     int GetWeight() const { return itsWeight; }
     void SetWeight(int weight) { itsWeight = weight; }

     // Andere Methoden
     void Speak() const { std::cout << "Mammal gib Laut!\n"; }
     void Sleep() const { std::cout << "Psst. Ich schlafe.\n"; }

protected:
     int itsAge;
     int itsWeight;
};

class Dog : public Mammal
{
public:
     // Konstruktoren
     Dog();
     Dog(int age);
     Dog(int age, int weight);
     Dog(int age, BREED breed);
     Dog(int age, int weight, BREED breed);
     ~Dog();

     // Zugriffsmethoden
     BREED GetBreed() const { return itsBreed; }
     void SetBreed(BREED breed) { itsBreed = breed; }

     // Andere Methoden
     void WagTail() { std::cout << "Schwanzwedeln...\n"; }
     void BegForFood() { std::cout << "Um Futter betteln...\n"; }

private:
     BREED itsBreed;
};

Mammal::Mammal():
itsAge(1),
itsWeight(5)
{
     std::cout << "Mammal-Konstruktor...\n";
}

Mammal::Mammal(int age):
itsAge(age),
itsWeight(5)
{
     std::cout << "Mammal(int)-Konstruktor...\n";
}

Mammal::~Mammal()
{
     std::cout << "Mammal-Destruktor...\n";
}

//  ????????? ... zwei zeilen nach unten befindet sich Mammal()
Dog::Dog():
Mammal(),    
itsBreed(YORKIE)
{
     std::cout << "Dog-Konstruktor...\n";
}
//  ????????? UND AUCH HIER Mammal(age) .... WOZU ???????
Dog::Dog(int age):
Mammal(age),        
itsBreed(YORKIE)
{
     std::cout << "Dog(int)-Konstruktor...\n";
}

Dog::Dog(int age, int weight):
Mammal(age),
itsBreed(YORKIE)
{
     itsWeight = weight;
     std::cout << "Dog(int, int)-Konstruktor...\n";
}

Dog::Dog(int age, int weight, BREED breed):
Mammal(age),
itsBreed(breed)
{
     itsWeight = weight;
     std::cout << "Dog(int, int, BREED)-Konstruktor...\n";
}

Dog::Dog(int age, BREED breed):
Mammal(age),
itsBreed(breed)
{
     std::cout << "Dog(int, BREED)-Konstruktor...\n";
}

Dog::~Dog()
{
     std::cout << "Dog-Destruktor...\n";
}

int main()
{
     Dog fido;
     Dog rover(5);
     Dog buster(6,8);
     Dog yorkie (3,YORKIE);
     Dog dobbie (4,20,DOBERMAN);
     fido.Speak();
     rover.WagTail();
     std::cout << "Yorkie ist "
         << yorkie.GetAge() << " Jahre alt.\n";
     std::cout << "Dobbie wiegt "
         << dobbie.GetWeight() << " Pfund.\n";
     return 0;
}





Das Resultat :

Mammal-Konstruktor...
Dog-Konstruktor...
Mammal(int)-Konstruktor...
Dog(int)-Konstruktor...
Mammal(int)-Konstruktor...
Dog(int, int)-Konstruktor...
Mammal(int)-Konstruktor...
Dog(int, BREED)-Konstruktor...
Mammal(int)-Konstruktor...
Dog(int, int, BREED)-Konstruktor...
Mammal gib Laut!
Schwanzwedeln...
Yorkie ist 3 Jahre alt.
Dobbie wiegt 20 Pfund.
Dog-Destruktor...
Mammal-Destruktor...
Dog-Destruktor...
Mammal-Destruktor...
Dog-Destruktor...
Mammal-Destruktor...
Dog-Destruktor...
Mammal-Destruktor...
Dog-Destruktor...
Mammal-Destruktor...
--
Man kann ein Problem nicht mit der gleichen Denkweise lösen, mit der es erschaffen wurde. (Albert Einstein)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.02.2006, 12:15 Uhr
Tommix



Hallo,
da die Basisklasse mehrere Konstruktoren hat, mußt Du der abgeleiteten sagen, welchen sie benutzen soll. Das ist - soweit ich mich erinnere - in dem Kapitel, zu dem der Code gehört beschrieben. Das ist doch aus C++ in 21 Tagen, oder?

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.02.2006, 12:15 Uhr
(un)wissender
Niveauwart


Ehrlichm kauf dir ein Buch oder melde dich als Frau an.
Google mal nach C++, Deklaration und Definition.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.02.2006, 12:48 Uhr
ref



Das ist nicht aus dem so gennante C++ in 21 Tagen .. Tommix.. bist du sicher dass dein antwort ist richtig??, Ich will GENAUE ANTWORT, danke
--
Man kann ein Problem nicht mit der gleichen Denkweise lösen, mit der es erschaffen wurde. (Albert Einstein)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.02.2006, 14:05 Uhr
ao

(Operator)


@ref: Lass die Aufrufe doch mal weg und guck, was passiert. Wenn Tommix recht hat, kompilierts nicht.

ao

Dieser Post wurde am 14.02.2006 um 14:05 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.02.2006, 14:06 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von ref:
Das ist nicht aus dem so gennante C++ in 21 Tagen .. Tommix.. bist du sicher dass dein antwort ist richtig??, Ich will GENAUE ANTWORT, danke

Das Erste kann ich bestätigen.


C++:

class Haupt
{
public:
  Haupt();
  Haupt(int a);
}

class Unter : public Haupt
{
public Unter();
public Unter(int a);
}

Unter::Unter() : Haupt(14) // hier wird basiskonstruktor nummer 2 aufgerufen
{
}

Unter::Unter(int a) : Haupt() // hier der erste
{
}



Wenn mans nicht angeben würde, würde er nicht wissen: soll er nun Haupt() oder Haupt(int a) aufrufen, deshalb muss mans angeben
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.02.2006, 09:50 Uhr
Tommix



'Morgen,

Zitat von ref:
Das ist nicht aus dem so gennante C++ in 21 Tagen ..

www.fun-soft.de/Download/ebooks/c++in21tagen/kap11.html#325019
Die Listings dort zeigen aber doch gewisse Parallelen zu dem hier geposteten.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.02.2006, 10:29 Uhr
RHBaum




Zitat:
da die Basisklasse mehrere Konstruktoren hat, mußt Du der abgeleiteten sagen, welchen sie benutzen soll.



Zitat:

Wenn mans nicht angeben würde, würde er nicht wissen: soll er nun Haupt() oder Haupt(int a) aufrufen, deshalb muss mans angeben



Sicher ?

Unter::Unter(int a) : Haupt() // hier der erste
{
}

Unter::Unter(int a) // hier der erste
{
}

sollte eigentlich identisch sein !

Wenn man in der Initialisierungsliste keine argumente fuer die basisklasse angibt, sollte der doch immer versuchen, den Standard konstruktor der Basisklasse zu verwenden ....

Ich krieg da nie fehler, wenn ich die basisklasse nicht expliziet auffuehre in der Initialisierungsliste, solange sie nen default CTor in irgend einer Form hat. Ansosnten krieg ich fehlermeldung, das die Basisklassen keinen Standardkonstruktor hat ....

Oder hab ich inhaltlich das Thema nur nich verstanden ? ^^

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
15.02.2006, 10:45 Uhr
Tommix



Ja, hast recht.
Die Frage war:

Zitat:

Wozu braucht man in diesem code Mammal() oder Mammal(age) in den markerten zeilen zu schreiben?


und meine Antwort hätte ich besser so formuliert:
Dieser Code dient dazu, der abgeleiteten Klasse zu sagen ... usw.
Es handelt sich hier jedenfalls um einen expliziten Aufruf eines Ctors der Basisklasse, ob nun notwendig oder nicht.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
15.02.2006, 11:01 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von RHBaum:


Zitat:

Wenn mans nicht angeben würde, würde er nicht wissen: soll er nun Haupt() oder Haupt(int a) aufrufen, deshalb muss mans angeben



Sicher ?

Unter::Unter(int a) : Haupt() // hier der erste
{
}

Unter::Unter(int a) // hier der erste
{
}

sollte eigentlich identisch sein !


ok hast recht, das beispiel war schlecht gewählt.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: