C++: protected-Elemente von Basisklasse "not accessible"

Ausgangssituation:
Code:
class TNetzKomponenteElektrisch
{
        protected:
                bool AnschliessenEin(TNetzKomponenteElektrisch *NetzKomponente, unsigned int Anschluss);
                bool AnschliessenAus(TNetzKomponenteElektrisch *NetzKomponente, unsigned int Anschluss);
                virtual bool AbschliessenEin(unsigned int Anschluss);
                virtual bool AbschliessenAus(unsigned int Anschluss);
};
Code:
class TSchaltAnlageElektrisch : public virtual TNetzKomponenteElektrisch
{
        protected:
                bool SetEingangSchieneVerbunden(unsigned int Schiene, unsigned int Eingang, bool Wert);
};
Wenn ich jetzt alles richtig verstanden habe, sollte es kein Problem sein, in SetEingangSchieneVerbunden die protected-Funktion der Basisklasse aufzurufen:
Code:
bool TSchaltAnlageElektrisch::SetEingangSchieneVerbunden(unsigned int Schiene, unsigned int Eingang, bool Wert)
{
        [B]TNetzKomponenteElektrisch* TempKomponente;[/B]

        if (Schiene < AnzahlSammelSchienen && Eingang < AnschluesseEinAnzahl)
        {
                mEingangVerbunden[Schiene][Eingang] = Wert;
                TempKomponente = mSammelSchienen.at(Schiene);

                if (Wert)
                        [B]TempKomponente->AnschliessenEin(GetAngeschlossenEin(Eingang),Eingang);[/B]
                else
                        [B]TempKomponente->AbschliessenEin(Eingang);[/B]

                return true;
        }

        return false;
}
Ich bekomme aber vom Compiler (Borland C++ Builder 6) folgende Fehler ins Gesicht geworfen:
[C++ Error] TSchaltAnlageElektrisch.cpp(246): E2247 'TNetzKomponenteElektrisch::AnschliessenEin(TNetzKomponenteElektrisch *,unsigned int)' is not accessible
[C++ Error] TSchaltAnlageElektrisch.cpp(248): E2247 'TNetzKomponenteElektrisch::AbschliessenEin(unsigned int)' is not accessible
[C++ Error] TSchaltAnlageElektrisch.cpp(273): E2247 'TNetzKomponenteElektrisch::AnschliessenAus(TNetzKomponenteElektrisch *,unsigned int)' is not accessible
[C++ Error] TSchaltAnlageElektrisch.cpp(275): E2247 'TNetzKomponenteElektrisch::AbschliessenAus(unsigned int)' is not accessible
Und damit habe ich gewissermaßen ein Problem, weil diese Meldungen bedeuten, dass ich die Zugriffsbeschränkungen von protected nicht wirklich begriffen habe. Ist das so?
Mein momentaner Workaround sieht so aus:
Code:
class TSchaltAnlageElektrisch;

class TNetzKomponenteElektrisch
{
             friend class TSchaltAnlageElektrisch;
};
Gefällt mir aber ganz ehrlich gesagt nicht wirklich.
Im Anhang ist das Projekt, falls sich jemand damit etwas spielen möchte (Netzberechnung.bpr ist die betroffene Baustelle)
Ich hoffe, dass mir jemand aus der Misere heraus helfen kann.

mfg benediktibk
 
Zuletzt bearbeitet:
Du erstellst in TSchaltAnlageElektrisch ein neues Objekt vom Typ TNetzKomponenteElektrisch und auf dessen geschützte Methoden kannst du nicht zugreifen. Du kannst ja auch aus anderen Methoden auch nicht darauf zugreifen. Dass die betroffene Klasse die Basisklasse des aktuellen Objekts ist, spielt dabei keine Rolle.
Um auf die geschützten Methoden zugreifen zu können, muss der Zugriff über das aktuelle Objekt selbst erfolgen.

Wenn das nicht möglich ist, weil es sich um zwei verschiedene Objekte handelt, ist der Weg über die befreundete Klasse schon richtig. Wenn dir das zu offen ist, kannst du ja auch nur die betroffene Methode als befreundet deklarieren.
 
Ich habe jetzt noch etwas ausprobiert:
Code:
class A
{
        protected:
                int Member;

        public:
                f(A ObjektA)
                {
                        ObjektA.Member = 10;
                }
};
class B : public A
{
        public:
                g(A ObjektA)
                {
                        ObjektA.f(A);
                        //ObjektA.Member = 10 <- Error
                }
};
In f kann ich ohne Probleme auf Member zugreifen, obwohl es ein fremdes Objekt ist. So habe ich das auch bisher verstanden, selber Namensbereich -> alles erlaubt. In B, welches ja eigentlich A enhält, geht das aber nicht mehr.
So wie es aussieht werde ich das über friend lösen müssen, auch wenn es mir nicht schmeckt. Und einmal ganz ehrlich: ich finde dieses Verhalten unlogisch, weil auf die geschützten Bereiche des eigenen Objektes kann ich schließlich zugreifen. :(

Vielen Dank für die schnelle und kompetente Hilfe,
benediktibk
 
Zuletzt bearbeitet:
ObjektA.Member = 10 in g() kann nicht gehen. ObjectA ist doch ein eigenes Objekt.
Hingegen müsstest du in der Klasse B direkt auf das Element Member zugreifen können,
da es ja vererbt wurde.
 
Zurück
Oben