2014-01-16 8 views
8

Ich versuche, eine Klasse von Objekten namens Tableaus zu schaffen, die Vektoren von unsigned ints im Wesentlichen Vektoren sind (sie sind wie Matrizen mit Ausnahme der Zeilen können unterschiedlich lang sein) habe ich geschrieben mit einigen Algorithmen. Das Hauptproblem ist, dass ich Iteratoren für diese Objekte aus der Vektorklasse erben will und ich weiß nicht wie.Wie "erben" Sie einen Iterator von einer STL-Klasse?

Ich habe mehrere 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 der STL-Container ist nicht mit virtuellen Destruktoren oder was auch immer. Also habe ich beschlossen, zu versuchen, durch Komposition zu "erben". Hier ist ein etwas-minimal Beispiel dafür, was ich versuche zu erreichen:

#include <vector> 
#include <iostream> 

class tableau { 
    private: 
    std::vector<std::vector<unsigned int> > rep; 
    public: 
    using std::vector<std::vector<unsigned int> >::iterator; 
    void push_back(std::vector<unsigned int> const& new_row) { 
     rep.push_back(new_row); 
    } 
}; 

int main() { 
    tableau t1; 
    std::vector<unsigned int> row1(10); 
    std::vector<unsigned int> row2(8); 

    t1.push_back(row1); 
    t1.push_back(row2); 

    tableau::iterator it = t1.begin(); 
    for (; it != t1.end(); ++it) { 
    //display rows of tableau 
    } 
    return 0; 
} 

Aber dann g ++ gibt mir die Fehler: Typen ‚std::vector<std::vector<unsigned int> >‘ ist kein Basistyp für Typen ‚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.

+3

Im Allgemeinen ist dies ein sehr guter Testfall. Gut gemacht. :) –

Antwort

10

Ihr erstes Problem ist, dass using nicht erlaubt, Typen von beliebigen nicht verwandten Typen zu stehlen (obwohl Sie dafür typedef verwenden könnten). Außerdem haben Sie keine begin() oder end() Mitglieder.

diese Probleme Beheben ergibt sich folgende:

#include <vector> 
#include <iostream> 

class tableau { 
    private: 
    std::vector<std::vector<unsigned int> > rep; 
    public: 
    typedef std::vector<std::vector<unsigned int> >::iterator iterator; 
    void push_back(std::vector<unsigned int> const& new_row) { 
     rep.push_back(new_row); 
    } 
    iterator begin() { return rep.begin(); } 
    iterator end() { return rep.end(); } 
}; 

int main() { 
    tableau t1; 
    std::vector<unsigned int> row1(10); 
    std::vector<unsigned int> row2(8); 

    t1.push_back(row1); 
    t1.push_back(row2); 

    tableau::iterator it = t1.begin(); 
    for (; it != t1.end(); ++it) { 
    //display rows of tableau 
    } 
    return 0; 
} 

jedoch Ihr Ansatz bedeutet, Sie gehen jede einzelne Funktion, die Sie aufrufen möchten, müssen wickeln.

Wenn ich Sie wäre, würde ich bei der Vererbung bleiben: obwohl der Rat, den Sie zitieren, korrekt ist, bedeutet das nicht, dass Vererbung unmöglich ist. Du wirst niemals deine tableau polymorph durch einen Zeiger-zu-Basis verwenden wollen, also dokumentiere einfach, dass niemand dies jemals versuchen sollte, und es wird dir gut gehen.

(Wenn Sie die Verwendung von „Zusammensetzung“, es heißt „komponieren“. Sie fragen, wie man „komponieren“, um den Vektor. Machen)

+0

Ok, das Konzept des Komponierens macht jetzt viel mehr Sinn, danke. Ich denke, ich bleibe in diesem Fall einfach bei der Erbschaft. –

+0

@Joseph: Ich denke, das ist weise. –

+0

+1 Die Vererbung von Containern ist nicht annähernd so schlimm, wie einige Leute versuchen, es zu machen. – jrok

Verwandte Themen