Custom Object aus std::vector entfernen
-
Hallo zusammen,
ich bin neu hier und bin absoluter Anfänger was C++ angeht. Komme aus der Java Ecke

Ich bin gerade dabei mir eine Art Manager Klasse zu schreiben. Die Klasse besitzt einen std::vector, der Pointer zu den Objekte beinhaltet, um die sich die Klasse kümmern will.
Gerade habe ich Probleme, die Methode zu schreiben, die es ermöglicht einen Pointer zu einem bekanntem Objekt aus dem vector zu entfernen.
Explizit geht es um
void removeObject(SomeObject* object);Hier das Header File:
class SomeManager { public : SomeManager(); virtual ~SomeManager(); void removeObject(SomeObject* object); void addObject(SomeObject* object); const std::vector<SomeObject*>& getObjectList() const; private : std::vector<SomeObject*> m_objectList; };Hier die entsprechende Implementierung( nur die Funktionen, um die es geht)
void SomeManager::removeObject(SomeObject* object) { //how to iterate over m_objectList find object //and remove object from m_objectList } void SomeManager::addObject(SomeObject* object) { m_recognizerList.push_back(object); } const std::vector<SomeObject*>& SomeManager::getObjectList() const { return m_objectList; }Wie iteriere ich über die Objekte im std::vector m_objectList?
Wie gesagt, bin komplett neu in C++.
Vielen Dank im vorraus
Gruß
-
Was soll die Manager-Klasse bringen? Zum Einfügen und Löschen reicht auch
std::vectorselbst.Und da du von Java kommst, hier gleich ein paar Tipps:
- Anders als in Java sind in C++ nicht alle Objekte Zeiger. Zeiger verwendet man sogar eher selten. Manuelle Speicherverwaltung mit
newunddeletebraucht man normalerweise gar nicht. Wenn du also einnewin deinem Code hast, ohne den Zeiger gleich in einen Smart-Pointer zu stecken, ist das tendenziell fragwürdig. - Da
SomeManagerkeine Basisklasse ist, muss der Destruktor nicht virtuell sein. Generell ist Vererbung in C++ weitaus seltener als in Java, und Klassen sind nicht per default darauf ausgelegt, geerbt zu werden. Funktionalität erweitert man oft durch freie Funktionen, andere Klassen oder Templates.
Um ein Element zu suchen und zu löschen, kannst du das Erase-Remove-Idiom einsetzen. Falls die Reihenfolge keine Rolle spielt, kannst du ein Element mit dem letzten tauschen und dann das letzte mittels
pop_back()entfernen. Generell solltest du dir aber überlegen, bei häufiger Suche auf einen anderen Containertypen wiestd::setumzusteigen.Und C++ lernst du nicht mal nebenbei. Kauf dir ein gutes Buch (z.B. C++ Primer) und lies die Konzepte ausführlich nach. Die STL mit Containern, Iteratoren und Algorithmen ist z.B. sehr wichtig. Auch wenn C++ oberflächlich ähnlich wie Java aussieht, unterscheiden sich die Programmierparadigmen grundlegend. Daher ist es wichtig, dass du C++-spezifische Techniken und Idiome möglichst früh lernst und nicht in Java denkst.
- Anders als in Java sind in C++ nicht alle Objekte Zeiger. Zeiger verwendet man sogar eher selten. Manuelle Speicherverwaltung mit
-
"Das nicht in Java denken", habe ich sehr schnell gemerkt.
Vielen Dank für deine Hilfe, hat mir sehr weitergeholfen.
Gruß