Problem mit Vererbungs Syntax
-
Hi,
ich schreibe hier weil ich glaube das das eher eine compiller spezifische sache ist.
class Primer : public Node<E>{
wenn ich diese einfache codestelle so benutze wie sie da steht,
habe ich das problem das ich nur auf die public elemente von Node zugreifen kann.
Jedoch würde ich auch gerne auf die protected elemente zugreifen, und hierbei kriege ich den fehler:E2247 'Node<int>::Next' is not accessible
obwohl es als protected definiert ist.
-
Hallo
Wenn du von außen auf Instanzen von Primer zugreifst, dann kannst du in der Tat nur auf public-Member zugreifen und nicht auf private oder protected. Außen bedeuten : außerhalb von Memberfunktionen von Primer oder Node. Das ist so im Standard definiert und läßt sich nur ändern, indem du den fraglichen Member von protected nach public umdefinierst.
Wenn dein Zugriff von innen erfolgt und du dann diesen Fehler bekommst, dann ist estwas anderes nicht in Ordnung, was du hier im Post nicht erwähnst. Mit dem Compiler hat das aber mit Sicherheit nichts zu tun.bis bald
akari
-
hm gut.. vieleicht sehe ich ja nur den fehler nicht.
template <class E> class Node { public: Node( E & Value ); Node( Node<E> * Prev, E & Value ); ~Node(); void add( E & Value ); void insert ( Node<E> * Prev, E & Value ); E & get() const; protected: virtual void invalidate() {} E * Element; Node<E> * Previous; Node<E> * Next; };
template <class E> class Primer : public Node<E>{// protected Node.. kein zugriff auf public möglich von außen public: Primer( E & Value ); Primer( Node<E> * Prev, E & Value ); //Schnellerer zugriff als in den Nodes möglich, über end void add( E & Value ); Node<E> & begin() const; Node<E> & end() const; Node<E> & next(); Node<E> & previous(); void destroy(); private: void invalidate(); Node<E> * Running; Node<E> * Begin; Node<E> * End; };
template <class E> Node<E> & Primer<E>::next(){ if ( Running->Next ){// Zugriff auf Next nicht möglich Running = Running->Next; } return *Running; } template <class E> Node<E> & Primer<E>::previous(){ if ( Running->Previous ){ Running = Running->Previous; } return *Running; }
-
Hallo
Du hast genau den speziellen Fall erwischt, das ich meine Erklärung verfeinern muß. Du darfst nur dann auf protected-Member von fremden Instanzen zugreifen, wenn die Instanz mit der gleichen Klasse wie this angesprochen wird. Fremde Instanz bedeutet alle Instanzen außer this. Du verwendest beim Zugriff in Primer::previous auf die Fremde Instanz Running aber den Datentp Node<E>. Das geht nach C++ Standard aber nicht. Es würde gehen wenn der Zeiger Running vom Typ Primer wäre.
Du wirst wohl dein Konzept überdenken müßen.Das läßt sich einfacher in einem Beispiel erklären :
class A { protected : int x; }; class B : public A { public : void Do() { x = 1; // Erlaubt : Eigene Instanz A* a = ...; // Kann auch ein Basiszeiger auf eine Instanz von B sein a->x = 2; // Nicht erlaubt : Fremde Instanz B* b = ...; b->x = 3; // Erlaubt : Fremde Instanz, aber gleiche Klasse } };
bis bald
akari
-
Hmm.. Okay, vielen dank schonmal..
Macht auch ürgentwie sinn ^^