Inhalt von Methoden teilweise ersetzen?



  • 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.



  • Code-Hacker schrieb:

    Hi!

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

    Was genau meinst du damit?



  • Juhu, danke.

    Habe eben das auch herausgefunden. Die friend funktion war nicht nötig.!!

    🙂 🙂



  • Hi!

    @interpreter:
    Damit meine ich das er beim Operator IN der klasse, also bei der Deklaration andere Parameterbezeichner verwende hat, als in der definition, ansonsten ginge das:

    class BMW : public Auto
    {
    public:
        BMW(int baujahr, bool fahrbereit, bool siehtGutAus)
            : Auto(baujahr, fahrbereit, siehtGutAus, "BMW")
        {}
        friend ostream& operator<<(ostream&, const BMW&); /* muss hier nicht deklariert sein  es sei denn es soll auf private Member zugegriffen werden können */
    };
    
    ostream& operator<<(ostream& os, const BMW& m)
    {
        return os << m.baujahr << " " << m.fahrbereit<<" "<<m.siehtGutAus;   
    };
    

    Naja, ich habe gleich noch was dazu gelernt, was Operatoren betrifft. Nämlich wo man sie wie deklarieren/definieren muss/kann.

    Code-Hacker



  • Code-Hacker schrieb:

    Hi!

    @interpreter:
    Damit meine ich das er beim Operator IN der klasse, also bei der Deklaration andere Parameterbezeichner verwende hat, als in der definition, ansonsten ginge das

    Das ist auch in Ordnung. Für den Compiler ist nur der Typ entscheidend.



  • Hi!

    Oh stimmt. Aber ich sehe wo sein Fehler war. Er hat einmal const und einmal nicht const angegeben. Sollte in beiden Fällen const sein.

    Code-Hacker



  • sdfgsdfg schrieb:

    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 🤡

    Weiß wer von euch darauf die Antwort? Ist mir auch schleierhaft, nen paar Tests
    haben gezeigt, dass Auto::Auto() zu beginn von BMW::BMW() aufgerufen wird, dann
    der Namen geändert und dann wird wieder Auto::Auto() aufgerufen wo der Namen ja
    auf "default" geändert wird.

    Ich dachte bei meinem Posting eigentlich daran, dass du in Auto::Auto() den
    Namen nicht setzt, deswegen wundert es mich umso mehr, dass es so auch geht 😕



  • Code-Hacker schrieb:

    Hi!

    Oh stimmt. Aber ich sehe wo sein Fehler war. Er hat einmal const und einmal nicht const angegeben. Sollte in beiden Fällen const sein.

    interpreter schrieb:

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

    😉



  • Wer erklärt mir jetzt wieso bei

    class BMW : public Auto
    {
    	public:
    		BMW(){ name = "325i";  };
    
    };
    

    Der Standardkonstruktor der class Auto aufgerufen wird und dann name gesetzt wird, genau wie ich das wollte (visual studio .net 2003).
    Bei visual studio 6.0 war das nicht so. Sollte dasjetzt standard sein oder wie??



  • iojoij schrieb:

    Wer erklärt mir jetzt wieso bei

    class BMW : public Auto
    {
    	public:
    		BMW(){ name = "325i";  };
    
    };
    

    Der Standardkonstruktor der class Auto aufgerufen wird und dann name gesetzt wird,

    Weil immer implizit der Default-Basisklassen-Ctor aufgerufen wird, wenn man nicht explizit einen anderen Basiklassenkonstruktor in der Initialisierungsliste aufruft.



  • sdfgsdfg schrieb:

    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?

    [...]

    Weiß wer von euch darauf die Antwort? Ist mir auch schleierhaft, nen paar Tests
    haben gezeigt, dass Auto::Auto() zu beginn von BMW::BMW() aufgerufen wird, dann
    der Namen geändert und dann wird wieder Auto::Auto() aufgerufen wo der Namen ja
    auf "default" geändert wird.

    operator void schrieb:

    und "Auto::Auto()" macht sowieso nicht, was du willst.

    Basisklassen können nur über die Initialisierungsliste initialisiert werden. Die Initialisierungsliste zu benutzen, solltest du dir grundsätzlich angewöhnen.

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

    wird dementsprechend zu

    BMW()
        : name("BMW")
    {
    }
    


  • Kurz: "Ich hab mit Auto::Auto() unter dem name="BMW" nen neues Objekt erzeugt"?


Anmelden zum Antworten