Ich versuche eine Klasse von Objekten namens Tableaux zu erstellen, die im Wesentlichen Vektoren von Vektoren von unsignierten Ints sind (sie sind wie Matrizen, außer dass die Zeilen unterschiedliche Längen haben können) mit einigen Algorithmen, die ich geschrieben habe. Das Hauptproblem ist, dass ich Iteratoren für diese Objekte von der Vektorklasse erben will und ich weiß nicht wie.
Ich habe einige verwandte Fragen und Antworten gelesen, und es ist ziemlich einfach für mich, std::vector<std::vector<unsigned int> >
öffentlich zu erben, aber der Konsens ist, dass dies aus Gründen von STL-Containern, die keine virtuellen Destruktoren oder was auch immer haben, schlecht ist. Also habe ich beschlossen, zu versuchen, durch Komposition zu "erben". Hier ist ein etwas minimales Beispiel für das, was ich erreichen möchte:
Aber dann gibt mir g ++ den Fehler: Typ ' std::vector<std::vector<unsigned int> >
' ist kein Basistyp für den Typ 'Tableau'. Ich fange gerade an, C ++ zu lernen, also sei bitte sanft, wenn ich etwas Dummes mache. Wenn Sie mehr von dem tatsächlichen Code, den ich geschrieben habe, wollen, lassen Sie es mich wissen.
Ihr erstes Problem ist, dass using
es nicht erlaubt, Typen von beliebigen nicht verwandten Typen zu stehlen (obwohl Sie typedef
dafür verwenden könnten). Außerdem haben Sie keine begin()
oder end()
Mitglieder.
Das Auflösen dieser Probleme führt zu folgendem:
%Vor%Ihr Ansatz bedeutet jedoch, dass Sie jede einzelne Funktion umbrechen müssen, die Sie anrufen möchten.
Wenn ich du wäre, würde ich bei der Vererbung bleiben : obwohl der von dir zitierte Ratschlag richtig ist, heißt das nicht, dass Vererbung unmöglich ist. Sie werden Ihre tableau
niemals polymorph durch einen Zeiger auf die Basis verwenden wollen, also dokumentieren Sie einfach, dass niemand dies jemals versuchen sollte, und Ihnen wird es gut gehen.
(Wenn Sie "composition" verwenden, heißt das "composing". Sie fragen, wie man den Vektor "komponiert".)
Tags und Links class c++ inheritance stl iterator