Ich habe eine Klasse, die eine std :: list enthält und public begin() und end() für const_iterator und private begin() und end() nur für den einfachen Iterator bereitstellen möchte.Wie stl wie Container mit öffentlichen Const-Iterator und privaten nicht-Const-Iterator bereitstellen?
Allerdings sieht der Compiler die private Version und beschwert sich, dass es privat ist, anstatt die öffentliche const-Version zu verwenden.
Ich verstehe, dass C++ nicht auf Rückgabetyp (in diesem Fall const_iterator und Iterator) überladen wird und daher die nicht-const-Version wählt, da mein Objekt nicht const ist.
Kurz von Gießen mein Objekt zu const vor dem Aufruf von begin() oder nicht überladen der Name beginnen gibt es eine Möglichkeit, dies zu erreichen?
Ich würde denken, dass dies ein bekanntes Muster ist, das die Leute schon einmal gelöst haben und gerne nachziehen würden, wie dies typischerweise gelöst wird.
class myObject {
public:
void doSomethingConst() const;
};
class myContainer {
public:
typedef std::list<myObject>::const_iterator const_iterator;
private:
typedef std::list<myObject>::iterator iterator;
public:
const_iterator begin() const { return _data.begin(); }
const_iterator end() const { return _data.end(); }
void reorder();
private:
iterator begin() { return _data.begin(); }
iterator end() { return _data.end(); }
private:
std::list<myObject> _data;
};
void myFunction(myContainer &container) {
myContainer::const_iterator itr = container.begin();
myContainer::const_iterator endItr = container.end();
for (; itr != endItr; ++itr) {
const myObject &item = *itr;
item.doSomethingConst();
}
container.reorder(); // Do something non-const on container itself.
}
Der Fehler vom Compiler ist so etwas wie folgt aus:
../../src/example.h:447: error: `std::_List_iterator<myObject> myContainer::begin()' is private
caller.cpp:2393: error: within this context
../../src/example.h:450: error: `std::_List_iterator<myObject> myContainer::end()' is private
caller.cpp:2394: error: within this context
Dank.
-William
Soweit ich sehe, gibt es keine Vererbung in Ihrem Code, wahrscheinlich sollten Sie korrigieren, ich bin eine Klasse privat abzuleiten '. –
Hoppla, die Änderungen waren nicht mehr synchron, danke, dass Sie darauf hingewiesen haben, jetzt ist es korrigiert. – WilliamKF
Wenn Ihr nicht-constes Begin & End für Ihren Container privat ist, warum möchten Sie private Funktionen für diesen Container bereitstellen? Warum nicht einfach die Listeniteratoren direkt verwenden? – AraK