Verstaendnisfrage
-
hi,
ich habe mir ne eigene Klasse Stack geschrieben... die klasse leitet bei mir von einer Klasse TRSDynamicList ab, die ein Array mit variabler groesse darstellt (aehnlich wie vector).
// protected um den zugriff auf die member-funktionen von TRSDynamicList zu unterbinden template <typename T, class Container = TRSDynamicList<T> > class Stack : protected Container { public: TRSStack() : Container() {} void Push(const T &rhs) { Add(rhs); } // Add fuegt in die Liste ein Objekt ein ... };
wenn ich mir den Standard anschaue, wird das dort wie folgt gemacht:
template <class T, class Container = deque<T> > class stack { ... protected: Container C; public: void push(const value_type& x) { C.push_back(x); } ... };
nur zur frage:
ist es so wie es der standard macht sinnvoller? ich meine die klasse nicht vom typ container erben zu lassen, sondern ein objekt des containers in der klasse zu instanzieren? wenn ja warum und wenn nein warum nicht?
danke!
-
Ich finde die Vererbung sinnvoller, da du sonst für jede gewünschte Funktion von Container deine eigene Funktion schreiben musst, die eben diese aufruft. Wenn du das nicht machst, muss man foo.Container.bar() schreiben.
-
ist es so wie es der standard macht sinnvoller?
Ja.
wenn ja warum
Weniger Abhängigkeiten, flexibler einsetzbar.
Vererbung ist nach friendship die stärkste Abhängigkeitsbeziehung die du in C++ ausdrücken kannst.
Du solltest nicht-öffentliche Vererbung nur einsetzen, wenn du davon auch einen Vorteil hast (das gilt natürlich auch für öffentliche Vererbung)
Mögliche Gründe wären:
* Du willst eine virtuelle Methode überschreiben
* Du brauchst Zugriff auf protected Member
* Das Objekt der vorhandenen Klasse muss länger leben als dein erweitertes Objekt
* Du willst von der Empty-Base-Optimization profitieren.
* Du willst polymorphes Verhalten in der abgeleiteten Klasse und in friends haben.So wie ich das sehe, ist keiner der Gründe in deinem Fall gegeben.
Ich finde die Vererbung sinnvoller, da du sonst für jede gewünschte Funktion von Container deine eigene Funktion schreiben musst, die eben diese aufruft. Wenn du das nicht machst, muss man foo.Container.bar() schreiben.
Du hast schon gesehen, dass der OP hier nicht öffentlich erbt und das er Stack hier als Adapter implementiert oder?
Ich sehe nämlich nicht wie deine Punkte zum Thema passen:da du sonst für jede gewünschte Funktion von Container deine eigene Funktion schreiben musst
Schreiben muss er so oder so etwas. Entweder eine using-Deklaration oder eine Forwarding-Funktion.
Wenn du das nicht machst, muss man foo.Container.bar() schreiben
Das ist keine Option da Container so oder so protected ist.
-
Hört einfach auf Hume