2012-03-29 2 views
1

Mein Problem ist die Verwendung von const_cast <>. Ich habe eine Klasse, die von Vektor erbt. Wenn ich jetzt in einer seiner Elementfunktionen this->begin(), this als const-Zeiger verwende, wird ein konstanter Iterator zurückgegeben, aber ich möchte einen nichtkonstanten Iterator erhalten. Der Code sieht so etwas wie ...Wie bekomme ich einen nichtkonstanten Iterator, während ich einen const "this" -Zeiger verwende?

class xyz : private std::vector<//something> 
{ 
public: 
xyz(); 
void doSomething(); 
} 

void doSomething() 
{ 
    xyz::iterator it; 
    it = this->begin(); 
    *it.insert(something); //here is the problem and this where I need to use const_cast 
          // and in a lot more places 
} 

In der obigen Funktion, da this->begin() eine const iterator zurück, ich bin eine konstante Iterator verwenden gezwungen und tun eine Schublade gesteckt, wenn ich ein Element einfügen müssen.

Ich dachte an const_cast bei this-> Arbeiten beginnen(), aber mein Freund hat mir gesagt, dass es eine schlechte Idee ist, die Konstantheit des this Zeigers zu entfernen. Wenn es so ist, wie geht es dann?

+5

Eigentlich haben Sie eine Dose Würmer mit * Ich habe eine Klasse, die von Vektor erbt *, warum erben Sie von 'std :: vector'? Es ist nicht für die Vererbung gedacht. –

+1

@Als: Notwendigkeit Ich brauche eine Klasse, die von Vektor erbt, so dass die Klasse selbst als Vektor fungiert und können Sie genauer darüber, warum es keine gute Idee ist zu erben, ich bin neu, also bitte helfen Sie mir. – ken

+0

[Warum sollte ich keine Standardcontainer ableiten/erben?] (Http://stackoverflow.com/questions/6806173/why-should-not-i-subclass-inherit-standard-containers) Sie sollten eher containshipp als Vererbung verwenden. –

Antwort

1

Wenn der Vektor einen Teil des Standes der Klasse, entweder als Mitglied oder als Basis (obwohl es wirklich schlechte Praxis öffentlich erben von vector), dann eine const Member-Funktion ist, sollte es nicht ändern. Wenn der Vektor Teil des Status ist und eine Funktion ihn ändert, sollte die Funktion nicht const sein.

Allgemein. Es gibt spezielle Fälle, in denen zum Beispiel der Vektor den zwischengespeicherten Zustand darstellt, der logisch berechnet wird, dessen Berechnung jedoch teuer ist. In solchen Fällen können Sie den Vektor als veränderbares Element definieren. Aber stellen Sie sicher, dass der Vektor wirklich nicht "beobachtbaren Zustand" darstellt.

Und schließlich scheint der Code, den Sie posten, nichts mit das Problem zu tun zu haben. Für Anfänger ist die einzige Funktion nicht-const. Und der Code wird nicht kompiliert, aus mehreren Gründen (Verwendung von this in einer Nichtmitgliedsfunktion , Aufruf einer Mitgliedsfunktion insert auf einem Iterator, die kein solches Mitglied hat, usw.).

Verwandte Themen