Protected hilft mir nicht!



  • Hi! Ich habe ein Problem mit Klassenableiten. Ich baue mir den Singletonpattern, wobei eine Basisklasse folgenderweise definiert wird:

    namespace Interface {
    
    	class basic {
    
    	protected:
    
    		// static data (appr. 8 bytes) - these are the only 'global' variables:
    		static basic* bw_;
    		static int exit_code_;
    /*...*/
    		// protected constructors and destructor:
    		basic(/*...*/);
    		basic(const basic&);
    		basic& operator=(const basic&);
    
    		// virtual destructor ensures polymorhism and avoids memory leaks:
    		virtual ~basic();
    
    	public:
    
    		//static methods:
    		static basic* obj() {
    			return bw_;
    		}
    
    		static void free() {
    			delete bw_;
    			bw_ = 0;
    			exit_code_ = 0;
    		}
    

    Die neue Klasse sieht so aus:

    namespace Interface {
    
    	class advanced: public basic {
    	public:
    		static bool create(/*...*/) {
    			if(bw_)
    				free();
    			bw_ = new basic(/*...*/);
    			if(!bw_)
    				exit_code_ = -1;
    			return bw_ != 0;
    		}
    	};
    }
    

    Leider klappt das nicht. Ich kriege die Meldung, dass ich protected Methode nicht ausführen darf!

    Error 1 error C2248: 'Interface::basic::basic' : cannot access protected member declared in class 'Interface::basic' c:\documents and settings\zdravko\my documents\visual studio 2005\projects\interface\interface\advanced.hpp 15


  • Mod

    Beim Zugriff auf protected nicht-statische Funktionen oder Daten muss der Zugriff stets über eine Referenz oder einen Zeiger auf die abgeleitete Klasse erfolgen. Der Zugriff soll erlaubt sein, weil die entsprechende Klasse eine Basisklasse ist. Den Sinn dieser zusätzlichen Regel kann man sich an einem einfachen Beispiel klar machen:

    class A
    {
    protected:
        int foo;
    };
    
    class B : public A
    {
    };
    
    class C : public A
    {
    public:
        void bar(A& a, B& b)
        {
            /* this-> */ foo = 0;   // ok
            b.foo = 0;              // fehler! C hat nichts mit den Daten eines B-Objektes zu schaffen
            a.foo = 0;              // fehler! muss ja kein C-Objekt dahinterstehen
    
    // brutal und böse:
            b.*(&A::foo) = 0;       // hier versagt die Zugriffskontrolle
        }
    };
    

    Für protected Konstruktoren der Basisklasse bedeutet das nun, dass diese nur über die Initialisierungsliste der Konstruktoren der abgeleiteten Klasse verwendet werden können.


Anmelden zum Antworten