Problem mit überladen von Operatoren



  • Grüsse euch,

    also, ich hab mir mal ein Beispiel zum überladen von Operatoren programmiert. Es funktioniert aber nicht so wie ich mir das vorgestellt habe:

    class Haus
    {
    public:
    	Haus() { mZustand = 100; }
    	~Haus() {}
    
    	int ZustandGeben() { return mZustand; }
    
    	const Haus& operator++();	
    	const Haus& operator--();
    private:
    	int mZustand;
    };
    
    const Haus& Haus::operator--() 
    {
    	--mZustand;
    	return *this;
    }
    
    const Haus& Haus::operator++()
    {
    	++mZustand;
    	return *this;
    }
    

    Ich hab nun folgendes in der Hauptfunktion stehen:

    vector<Haus*> vHaus;
    
    for(unsigned int x;x<5;++x)
        vHaus.push_back(new Haus);
    
    cout << "Einheit greift Haus an!" << endl;
    for(unsigned int v;v<10;++v)
        vHaus[2]--;
    cout << "Einheit wurde vernichtet, Zustand des Hauses: " << vHaus[2]->ZustandGeben() << endl;
    for(unsigned int vv;vv<10;++vv)
        vHaus[2]++;
    cout << "Haus repariert, Zustand des Hauses: " << vHaus[2]->ZustandGeben() << endl;
    
    for(unsigned int xx;xx<vHaus.size();++xx)
        delete vHaus[xx];
    

    Irgendwie verändert sich die Elementvariable mZustand nicht, aber ich weis nicht warum, die Operatoren wurden doch richtig überladen!?:

    Einheit greift Haus an!
    Einheit wurde vernichtet, Zustand des Hauses: 100
    Haus repariert, Zustand des Hauses: 100

    An was liegt das? Ich bedanke mich schon mal für eure Hilfe!

    bye



  • die Operatoren wurden doch richtig überladen!?:

    Nö. Du überlädst die Präfixvariante, rufst aber die Suffixvariante auf.
    Bleibt noch die Frage, wieso das geht?

    entweder:

    --vHaus[2];

    oder neben 'const Haus& Haus::operator--()' auch noch 'const Haus Haus::operator--(int)' überladen.



  • habe ich auch gerade bemerkt, hab nun in der Main-Funktion die [edit]Präfix[/edit] variante angewendet, immernoch das selbe Problem



  • for(unsigned int v;v<10;++v)
    

    Mit welchem Wert für v startet denn die Schleife????

    @ der_held

    Du überlädst die Präfixvariante, rufst aber die Suffixvariante auf.Bleibt noch die Frage, wieso das geht?

    Manche Compiler sind so freundlich und geben nur ne Warnung.



  • ... und außerdem wendest du ++ und -- auf den Pointer zum Haus an ....



  • Geo schrieb:

    Manche Compiler sind so freundlich und geben nur ne Warnung.

    der MinGW macht anscheinend nicht einmal dies! 👎

    Geo schrieb:

    for(unsigned int v;v<10;++v)
    

    Mit welchem Wert für v startet denn die Schleife????

    was meinst du? 😕



  • for (unsigned v; v < 10; ++v) cout << v << '\n';
    

    lass dir das ausgeben und du verstehst, was gemeint ist.



  • Um's kurz zu machen: C++ initialisiert nicht mit 0.

    Falls du es nicht mitbekommen hast:

    Das ist der entscheidende Hinweis:

    ... und außerdem wendest du ++ und -- auf den Pointer zum Haus an ....



  • Damit gcc-Compiler und damit auch MinGW Warnungen ausgeben, sollte man die Optionen "-Wall" oder noch besser "-W -Wall" setzen.

    Grüße
    Fux



  • Helium schrieb:

    Um's kurz zu machen: C++ initialisiert nicht mit 0.

    jetzt ist der schöne lerneffekt weg. außerdem zu sehr generalisiert 😉



  • @davie:
    mit einer wahrscheinlichkeit von 1:6553.6 (angenommen int ist short) wird die schleife nichtmal ausgeführt!! Also würde des garnet angezeigt werden!

    Ich hab so das leise gefühl, Geo und Mobb Deep haben vorher oft PHP programmiert.



  • außerdem zu sehr generalisiert

    Klar er kann natürlich auch
    for (unsigned v=unsigend(); ...
    schreiben 😉


Anmelden zum Antworten