anfängerfrage vererbung
-
hallo zusammen,
mal eine frage, wenn ich folgende klassen defintion habe:
class ByteArray : public std::vector<byte> { }Warum komme ich dann nicht mehr an diesen Konstruktor ran:
template <class InputIterator> vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );Also ich wollte dies machen:
int[] array = {1,2,3,4}; ByteArray data(&array[0], buffer+4);Wenn ich die Klassendefintion durch ein typedef ersetzt geht es, logischer weise.
gruß
sven
-
Konstruktoren werden nicht vererbt.
-
sven_ schrieb:
Wenn ich die Klassendefintion durch ein typedef ersetzt geht es, logischer weise.
Ist auch besser. Nutze Vererbung nur wenn du musst. C++ ist nicht JavaLand, wo alles von jedem erben kann/muss/sollte. std::vector ist z.B. nicht darauf ausgelegt, dass man von ihm erbt.
-
hallo zusammen,
das konstruktoren nicht vererbt werden, war mir neu. ok, ok. gut zu wissen. ich persönlich liebe die nutzung der vererbung, da man so semantisch wertvollere konstrukte bauen kann, welche typsicher und erweiterbar sind. ich habe eine eigene template klasse List<T>, welche basisoperationen anbietet und die ich über vererbung selektiv erweitern kann. das ist eigentlich ne super sache. aber ok, konstruktoren werden nicht vererbt. merk ich mir.
was hat vektor gegen seine beerbung?
vielen dank!
sven_
-
sven_ schrieb:
was hat vektor gegen seine beerbung?
Einen fehlenden virtuellen Destruktor, so dass man ihn nicht gut polymorph benutzen kann. Wenns nur um Hinzufügen von Methoden eght benutzt man normalerweise freie Funktionen in C++, und wenn man die Klassen nicht polymorph nutzen möchte schaut man normalerweise, dass man Komposition der Vererbung vorzieht.
-
sven_ schrieb:
ich persönlich liebe die nutzung der vererbung, da man so semantisch wertvollere konstrukte bauen kann,
Aha?
sven_ schrieb:
welche typsicher
Typsicherheit ist da, um nicht versehentlich einen Typ mit Eigenschaft X in einen Typ ohne Eigenschaft X umzuwandeln. Beim typedef haben die Typen aber die gleichen Eigenschaften, und sind somit immer sicher.
sven_ schrieb:
und erweiterbar sind.
Da nimmt man freie Funktionen. Warum das in vielen Fällen eh der zu bevorzugende Weg ist.
-
hallo nochmals,
vielen dank für die hinweise. da hab ich doch mal wieder etwas zu lesen. fein. das mit den semantisch wertvolleren konstrukten sein nochmals erklärt.
Ich entwickle für verschiedene Systeme und Plattformen, inkl. Simulatoren. Da ist es echt nervig, dass bestimmte Dinge unterschiedlich abgebildet werden (z.B. Repräsentation einer Zeit, einer Adresse, etc.). Nun kann es sein, dass auf einem System die Defintionen so ausehen:
[cpp
typedef long LONG;
typedef int INT;typedef std::vector<INT> A;
typedef std::vector<LONG> B;
[/cpp]
wenn ich dann Dummerweise folgendes tue:A a; B b = b;bekomme ich keine Fehlermeldung. Bei "echten" Klassen schon. Dies meine ich mit semantische reicher. Der Fehler kann echt vertrackt sein, da sucht man sich unter umständen echt einen ab.
gruß und dank
-
Der Ausdruck ist ja auch legal, dennoch:
warning: variable 'b' is uninitialized when used within its own initialization [-Wuninitialized] B b = b; ~ ^Die Meldung kommt auch, wenn man die Typedefs weglässt.
Und warum sollte man solche Konstrukte erstellen?
typedef long LONG
-
hallo,
ja das ist ein Fehler, das sollte natürlich B b = a; heißen. Die Bezeichnungen sind ja wie oben gesagt nur symbolisch. Wenn ich auf Linux bin, dann ist die Zeit ein time_t, im Simulator sim_time, welche eigentlich nur ein double ist. Wenn ich dann noch eine weiteren typedef habe, kann es zu falschen zuweiseungen kommen.
sven
-
sven_ schrieb:
hallo,
ja das ist ein Fehler, das sollte natürlich B b = a; heißen. Die Bezeichnungen sind ja wie oben gesagt nur symbolisch. Wenn ich auf Linux bin, dann ist die Zeit ein time_t, im Simulator sim_time, welche eigentlich nur ein double ist. Wenn ich dann noch eine weiteren typedef habe, kann es zu falschen zuweiseungen kommen.
sven
Such mal nach "Boost strong typedef", das könnte in die Richtung gehen, die du brauchst

-
Ah! Wieder was gelernt. Vielen Dank. Das ist in der Tat nicht schlecht. Nur noch eine Frage für BestPractice. Wo schiebt ihr solche StrongTypedefs hin? Eigene Header? Ne Sammelheader? In die Klasse, wo ich es beim Programmieren das erste mal brauche?
Gruß