Inhalt von Methoden teilweise ersetzen?



  • interpreter schrieb:

    BMW hat keinen Default-Konstruktor.

    Was meinst du? Stimmt was nicht mit der main Funktion?



  • Schon klar:

    int main()
    {	
    	BMW(2004, true, true);
    	return 0;
    };
    


  • Den letzten Parameter des BMW-Konstruktors kannst du dir sparen: Ein BMW sieht immer gut aus. 🙂



  • Ich würd den Namen im Auto-Konstruktor gar nicht setzen und dann einfach in der BMW Klasse im Konstruktor folgendes machen

    BMW()
    {
       name = "BMW";
       Auto::Auto();
    }
    


  • Und wie gebe ich das jetzt aus?

    int main()
    {	
    	BMW(2004, true, true);
    	cout<<""; //Wie gebe ich das denn jetzt aus? Da soll: 2004 true true stehen.
    	WAIT;
    	return 0;
    };
    


  • reden wir immernoch über den code von HumeSikkins?
    dann funkt das nicht, weil auto keinen def kontruktor hat
    ausserdem weist du zuerst einer member variable einen wert zu, die dann wieder durch den def kontruktur auf einen def. wert gesetzt wird.

    muss heisen:

    BWM () : Auto()
    {
        Auto::Auto();
        name = "BMW";
    }
    


  • ostream& operator<<(ostream& o, const BMW& bmw) {
    o << bmw.baujahr << " " << bmw.siehtgutaus;
    // usw
    return o;
    }



  • neWk schrieb:

    Und wie gebe ich das jetzt aus?

    int main()
    {	
    	BMW(2004, true, true);
    	cout<<""; //Wie gebe ich das denn jetzt aus? Da soll: 2004 true true stehen.
    	WAIT;
    	return 0;
    };
    

    da musst du den << operator überladen, müsste ja im forum genug posts dazu geben ( suchen )



  • Hi!

    @neWk:
    1. Solltest du ein Objekt erstellen und nicht nur den Konstruktor aufrufen:

    BMW my_BMW(2004, true, true);
    

    2. Wenn du das ausgeben willst ging das auch vorher nicht. Ein Konstruktor hat keinen Rückgabewert, aber du könntest ja den <<-Operator überladen:

    friend ostream& operator<<(ostream& ostr, const BMW& bmw_ausg)
    {
      return ostr << bmw_ausg.baujahr << ' ' << bmw_ausg.fahrbereit << ' ' << bmw_ausg.siehtgutaus; 
    }
    

    EDIT: zu spät.

    Code-Hacker



  • btw finde ich diese Vererbungshierarchie nicht gut und ist imo eine übertriebene Spezialisierung. Warum nicht einfach so:

    class Auto {
       // ...
       Hersteller hersteller;
       Typ typ;
    };
    


  • Code-Hacker schrieb:

    Hi!

    @neWk:
    1. Solltest du ein Objekt erstellen und nicht nur den Konstruktor aufrufen:

    BMW my_BMW(2004, true, true);
    

    2. Wenn du das ausgeben willst ging das auch vorher nicht. Ein Konstruktor hat keinen Rückgabewert, aber du könntest ja den <<-Operator überladen:

    friend ostream& operator<<(ostream& ostr, const BMW& bmw_ausg)
    {
      return ostr << bmw_ausg.baujahr << ' ' << bmw_ausg.fahrbereit << ' ' << bmw_ausg.siehtgutaus; 
    }
    

    EDIT: zu spät.

    Code-Hacker

    Das friend keyword ist an dieser Stelle falsch.



  • DEvent schrieb:

    BWM () : Auto()
    {
        Auto::Auto();
        name = "BMW";
    }
    

    Wie wäre es denn einfach mit

    BMW()
    {
        name = "BMW";
    }
    

    ?

    Auto muss nicht in der Initialisierungsliste erwähnt werden, weil es default-konstruiert wird, und "Auto::Auto()" macht sowieso nicht, was du willst.



  • Hi!

    @interpreter:
    Stimmt. Ich dachte die Elemente wären private.
    Aber ne Begründung deiner Aussagen wäre manchmal nicht schlecht...

    Code-Hacker



  • SirLant schrieb:

    Ich würd den Namen im Auto-Konstruktor gar nicht setzen und dann einfach in der BMW Klasse im Konstruktor folgendes machen

    BMW()
    {
       name = "BMW";
       Auto::Auto();
    }
    

    Stimmt das ich nicht eher darauf gekommen bin 👎 .
    Eine Frage noch dazu:

    Wieso wird der name nicht wieder überschrieben wenn man vor dem Konstruktor den namen setzt?

    #include <string>
    #include <iostream>
    using namespace std;
    
    class Auto
    {
    	public:
    		Auto();
    		void LeseDaten();
    
    		int baujahr;
    		int x,y,z;
    		bool fahrbereit;
    		bool siehtgutaus;
    		string name;
    };
    
    Auto::Auto()
    {
    	baujahr = 2004;
    	x = 0;
    	y = 0;
    	z = 0;
    	fahrbereit = true;
    	siehtgutaus = true;
    	name = "default";
    };
    
    void Auto::LeseDaten()
    {
    	cout<<"Baujahr       : "<<baujahr<<endl;
    	cout<<"X             : "<<x<<endl;
    	cout<<"Y             : "<<y<<endl;
    	cout<<"Z             : "<<z<<endl;
    	cout<<"Fahrbereit    : "<<fahrbereit<<endl;
    	cout<<"Sieht gut aus : "<<siehtgutaus<<endl;
    	cout<<"Name          : "<<name<<endl;
    };
    
    class BMW : public Auto
    {
    	public:
    		BMW(){ name = "325i";  Auto::Auto(); };
    
    };
    
    int main()
    {
    	BMW bmw;
    	bmw.LeseDaten();
    
    	system("pause");
    	return(0);
    }
    

    Ansonsten sollte das nur ein Beispiel sein, was besseres ist mir nicht eingefallen, hab da eben alles public gelassen man möge mir verzeihen 🤡



  • operator void schrieb:

    DEvent schrieb:

    BWM () : Auto()
    {
        Auto::Auto();
        name = "BMW";
    }
    

    Wie wäre es denn einfach mit

    BMW()
    {
        name = "BMW";
    }
    

    ?

    Auto muss nicht in der Initialisierungsliste erwähnt werden, weil es default-konstruiert wird, und "Auto::Auto()" macht sowieso nicht, was du willst.

    Bis eben dachte ich, ich hätte es kapiert 😃 Warum geht das denn so nicht?



  • Code-Hacker schrieb:

    Hi!

    @interpreter:
    Stimmt. Ich dachte die Elemente wären private.

    Auch wenn sie privat gewesen wären, wäre friend hier falsch 😉
    friend darf nur in Klassen benutzt werden.

    Aber ne Begründung deiner Aussagen wäre manchmal nicht schlecht...

    Ja. Sorry, bin heute etwas schlecht gelaunt 😕



  • Hi!

    @interpreter:
    1. Weiß ich.
    2. Merke ich.

    Code-Hacker



  • Ok, so ganz genau verstehe ich den Code noch nicht, aber das Problem besteht immer noch: Wie gebe ich das aus??

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    #define WAIT for(;;);
    
    class Auto
    {
    public:
    	Auto(int baujahr, bool fahrbereit, bool siehtGutAus, string name)
    		: baujahr(baujahr)
    		, fahrbereit(fahrbereit)
    		, siehtGutAus(siehtGutAus)
    		, name(name)
    	{}		
    public:
    	int baujahr;
    	bool fahrbereit;
    	bool siehtGutAus;
    	string name;
    
    };
    
    class BMW : public Auto
    {
    public:
    	BMW(int baujahr, bool fahrbereit, bool siehtGutAus)
    		: Auto(baujahr, fahrbereit, siehtGutAus, "BMW")
    	{}
    	friend ostream& operator<<(ostream& os,BMW& m); 	
    };
    
    ostream& operator<<(ostream& o, const BMW& bmw) 
    { 
    	return o << bmw.baujahr << " " << bmw.fahrbereit<<" "<<bmw.siehtGutAus;	
    };
    
    int main()
    {	
    	BMW my_BMW(2004, true, true);
        //wie gebe ich das jetzt aus???	
    	WAIT;
    	return 0;
    };
    

    Was ist falsch daran?



  • Hi!

    Das muss so aussehen, abgesehen davon müssen die Parameter auch immer gleich heißen:

    class BMW : public Auto
    {
    public:
        BMW(int baujahr, bool fahrbereit, bool siehtGutAus)
            : Auto(baujahr, fahrbereit, siehtGutAus, "BMW")
        {}
    
        friend ostream& operator<<(ostream& os,BMW& bmw)
        {
            return o << bmw.baujahr << " " << bmw.fahrbereit<<" "<<bmw.siehtGutAus;   
        }    
    };
    

    Code-Hacker



  • cout << my_BMW;

    Nebenbei: Die Signatur deines operator<< stimmt nicht mit der Signatur der als friend deklarierten Funktion überein.


Anmelden zum Antworten