Standardkonstruktor



  • Kann mir bitte mal jemand erklären waraum folgendes Programm nicht funktioniert:

    #include<iostream>
    using namespace std;
    
    class Motor
    {
    	int ps;
    	int kw;
    public:
    	Motor(int p,int k) {ps=p; kw=k;}
    	void getdaten() {cout<<ps<<endl; cout<<kw<<endl;}
    	virtual ~Motor() {}
    };
    
    class Auto:public Motor
    {
    protected:
    	char* name;
    	Motor motor;
    public:
    	Auto(char* n,int p,int k):motor(p,k) {name=n;}
    	void getdaten() {cout<<name<<endl; motor.getdaten();}
    	virtual ~Auto() {}
    };
    
    class Sportwagen:public Auto
    {
    	bool extras;
    public:
    	Sportwagen(bool e,char* n,int p,int k):Auto(n,p,k) {extras=e};
    	void getdaten();
    };
    
    inline void Sportwagen::getdaten()
    {
    	Auto::getdaten();
    	if(extras) cout<<"Mit Extras"<<endl; else cout<<"Keine Extras"<<endl;
    }
    
    Sportwagen Porsche(true,"911",200,111);
    
    int main()
    {
    	Porsche.getdaten();
    	return 0;
    }
    

    Der Fehler liegt hier:

    Auto(char* n,int p,int k):motor(p,k) {name=n;}

    -> Motor' : Kein geeigneter Standardkonstruktor verfuegbar

    Klar das kein Standardkonstruktur zur Verfügung steht, denn ich habe ja selbst einen Konstruktur in der Klasse Motor aufgesetzt,,und um in der Klasse das eingebettete Objekt Motor zu erzeugen, muss man den Konstruktor von Motor in der Konstruktorliste von Auto aufrufen,,wieso funktioniert das nicht,,Der Konstruktor von Motor wird doch mit 2 INT-Werten aufgerufen?!



  • AJ_Styles schrieb:

    class Auto:public Motor
    {
    protected:
    	char* name;
    	Motor motor;
    public:
    	Auto(char* n,int p,int k):motor(p,k) {name=n;}
    	void getdaten() {cout<<name<<endl; motor.getdaten();}
    	virtual ~Auto() {}
    };
    

    Das ist Humbug - bzw. du hast zwei Subobjekte vom Typ "Motor" in deinem Auto: einmal die Member-Variable "motor" (die vom Konstruktor korrekt initialisiert wird) und einmal die Basisklasse Motor (für die ein Default-Konstruktor gesucht wird). Eine von beiden ist überflüssig (ich würde spontan sagen, an der Stelle passt Vererbung nicht wirklich - oder IST ein Auto ein Motor?).

    PS: Und die Methode "Sportwagen::getdaten()" solltest du auch innerhalb der Klassendefinition erwähnen 🙂



  • mal was zum Design: ein Auto ist kein Motor, ein Auto hat einen Motor, ergo ist hier Vererbung der falsche Ansatz

    edit: waa erst lesen^^ sehe CStoll hat das ja schon angesprochen



  • Da war einer schneller 🙂

    an der Stelle passt Vererbung nicht wirklich - oder IST ein Auto ein Motor?

    Da kann ich CStoll zustimmen, als eingebettetes Objekt macht sich Motor sicher besser.
    getDaten() deines Autos sollte vielleicht auch eher virtuell sein.

    mfg



  • Natürlich 😉

    Danke an alle!!


Anmelden zum Antworten