Unschöne protected Variable umgehen



  • Hallo,

    ich habe leider auf die Schnelle nichts Passendes in der Forensuche gefunden, deshalb poste ich mal mein Problem.

    Ich habe zwei von der selben Klasse abgeleitete Klassen, die sich im Wesentlichen in einer Funktion von der Basisklasse unterscheiden. Die Funktion heißt zwar immer gleich, soll aber bei den abgeleiteten Klassen je nach Klasse etwas anders arbeiten. Die Funktionen arbeiten mit einer Membervariable der Basisklasse, die dafür ja nicht private sein darf, also ist sie zumindest protected. Ich habe aber gelesen, dass es unüblich, weil wartungsintensiv, ist, Variablen protected zu setzen. Wie kann ich das umgehen? Mit Getter- und Setterfunktionen?

    LG, Korbinian



  • Zum Beispiel. Du könntest vielleicht auch das Strategy Pattern benutzen und dir so die ganze Klassenhierarchie sparen. Aber dafür wissen wir noch zu wenig über dein Problem.



  • Ich sehe in so einem Fall eigentlich keinen Grund, nicht protected zu verwenden. Dafür ist es ja irgendwie da.



  • kleiner Troll schrieb:

    Ich sehe in so einem Fall eigentlich keinen Grund, nicht protected zu verwenden. Dafür ist es ja irgendwie da.

    Dass du keinen Grund siehst kann ich mir schon vorstellen.

    Aber die Erfahrung hat gezeigt, dass es zu schlecht wartbarem Code fuehren kann, wenn man protected verwendet. Genaueres kann man zum Beispiel in Effective C++ von Meyers nachlesen.



  • #include <vector>
    
    class Base
    {
    public:
        virtual ~Base(){}
    
        void foo()
        {
            foo_core( a );
        }
    
    private:
        int a;
    
        virtual void foo_core( int value ) = 0;
    };
    
    class A : public Base
    {
    private:
        virtual void foo_core( int value )
        {
            int a = 5 + value;
        }
    };
    
    class B : public Base
    {
    private:
       virtual void foo_core( int value )
       {
            int summe = 0;
            for( int i = 0; i < value; ++i )
            {
                summe += i;
            }
       }
    };
    
    int main()
    {
        std::vector<Base*> t = { new A, new B };
        std::vector<Base*>::iterator base = t.begin();
        for ( ; base != t.end(); ++base )
        {
            ( *base )->foo();
        }
        return 0
    }
    


  • Klingt irgendwie so, als ob die Membervariable eben nicht in die Basisklasse gehört, oder die Basisklasse überhaupt keine Basisklasse sein sollte...



  • Hallo,
    vielen Dank für die schnellen Antworten! Dass das ganze ein wenig umständlich ist, ist mir klar, aber es ist eine Übungsaufgabe und die Struktur ist so vorgegeben.
    Ich bin noch Anfänger und deshalb geht das alles nicht so schnell, werd mich am Wochenende mit dem geposteten Code befassen, dann meld ich mich wieder! 😃

    LG



  • Ich konnte das Problem doch mit den Getter- und Setterfunktionen der Basisklasse lösen, hatte gestern nur einen Syntaxfehler bei der Verwendung von this.

    Hier der Code zu der Methode Einer der abgeleiteten Klassen:

    // CForwardCounter.cpp
    
    #include "CForwardCounter.h"
    
    void CForwardCounter::count() //Zaehlt Eins weiter
    {
    	this->setValue(this->getValue() + 1 );
    }
    

    LG


Anmelden zum Antworten