[c++] List problem

Xervos

Erfahrenes Mitglied
Hallo Leute,

ich bin gerade dabei mich in c++ einzuarbeiten. Es funkioniert soweit schon alles recht gut nur merke ich schnell das ich als relativer C++ neuling, schnell an meine Grenze stosse, deshalb habe ich mich entschlossen hier mal nachzufragen vll kann mir einer helfen.

Also mal zu meiner aufgabenstellung:

Ich möchte gerne Objekteverwalten, zb. Texte, Images usw. Diese sollen in einem ObjectManager gespeichert und verwaltet werden. Diese Objecte werden von anderen Klassen in den ObjectManager geladen der diese dann verwaltet.

Ich habe das ganze schon geschafft und habe es mit einer ListenKnoten "gelöst" das Funktionierte soweit ganz gut, bis ich auf einen Fehler drauf gekommen bin. Wenn ich jetzt zb ein bestimmtes Objekt aus der Liste löschen will dann stoße ich an meine grenzen.

Ein Beispiel:

Die Klasse a lädt objekte in den ObjectManager, die Klasse b lädt objekte rein usw. Jetzt möchte Klasse a das der ObjectManager die Objekte wieder freigibt die Klasse A reingeladen hat. Naja jetzt habe ich das Problem, die Objekte der KLasse B sind aber in der ListKnote weiter vorne und von da an beginnt das Programm nun zu arbeiten. Ich schaffe es einfach nicht die Objekte der Klasse A zu finden, zu löschen und die Liste neu zu Ordnen.

Jetzt habe ich mich ein bisschen im internet Schlau gemacht und etwas über das std::List gelesen nur wie bekomm ich das zum laufen ? Zur anschaung:

Code:
	struct GameObjectList
    {
	int ID;
	std::string szName;
    GameObjectState GameState;
	GameObjectGroup ObjectGroup;
    GameObject ObjectInstance; 
    };

Ich habe hier ein Struct nun möchte ich darüber eine Liste legen und diese Befüllen, bzw. element daraus löschen können

Wenn ich die Liste aber nun non so anlege:

Code:
std::list<GameObjectList> ListGameObjects;

Sagt der Compiler 'list': Ist kein Element von 'std' O_O ich kenne mich nicht mehr aus aber wenn ich im Compile Std:: mache dann kommt da list zur auswahl ******

Naja ich brauche dringend hilfe wie das den wirklich geht. Wie gesagt ich habe das vorher mit Pointer gemacht aber da habe ich gelesen das dies nicht soo gut ist.

lg
Christoph
 
Hi.
Wenn ich die Liste aber nun non so anlege:

Code:
std::list<GameObjectList> ListGameObjects;

Sagt der Compiler 'list': Ist kein Element von 'std'
Dir fehlt:
C++:
#include <list>

Um Objekte in einer std::list (oder einem anderen STL Kontainer) finden zu können, muss der operator== für diese Objekte definiert sein:
C++:
bool operator== (const GameObject& a, const GameObject& b) {
  return a.ID == b.ID;
}
Dann
C++:
std::list<GameObject> gameObjectList;

gameObjectList.push_front(aGameObject);
...
gameObjectList.remove(aGameObject);
Gruß
 
Ahh danke für die Antwort.

ok ich habe das jetzt mal umgebaut und es geht soweit nur nun eine Frage wie kann ich da jetzt löschen ?

habe es so versucht aber das geht ned.

Code:
bool ObjectManager::ClearList(ObjectManager::GameObjectState i_GameState)
{
	GameObjectList Object;
	for(std::list<GameObjectList>::const_iterator it = ObjectList.begin(); it != ObjectList.end(); ++it)
	{
		if(it->GameState == i_GameState)
		{
			ObjectList.remove(it);
		}
	}	

	return LIST_SUCESS;
}
 
Hmm ok aber wenn ich das mache dann bekomme ich
"list iterator not incrementable"

for(std::list<GameObjectList>::const_iterator it = ObjectList.begin(); it != ObjectList.end(); ++it)
{
if(it->GameState == i_GameState)
{
ObjectList.erase(it);
}
}

return LIST_SUCESS;
 
Schon aber so ganz steig ich noch ned drüber aber danke dir :) das war jetzt läuft es, habe mir schon fast so was gedacht aber eben die lösung habe ich nicht geschnallt.

Eines noch:

Wenn ich jetzt zb. etwas in der Struct für die Posi it was ändern will muss ich das vorher kopieren oder kann ich da einfach so zugreifen drauf ?

zb. Habe ich hier eine Funktion die mir die Farbe ändert. aber wenn ich das mache dann bekomm ich irgendwas mit string kann nicht in sf::Drawable umgewandelt werden, aber da gibt es gar kein String

bool ObjectManager::UpdateStringObject(int i_ID, sf::Color i_SetColor)
{

for(std::list<GameObjectList>::const_iterator it = ObjectList.begin(); it != ObjectList.end(); ++it)
{
if(it->ID == i_ID)
{
it->ObjectInstance.StringObject.SetColor(i_SetColor);
}
}

return LIST_SUCESS;

}
 
Zuletzt bearbeitet:
Eines noch:

Wenn ich jetzt zb. etwas in der Struct für die Posi it was ändern will muss ich das vorher kopieren oder kann ich da einfach so zugreifen drauf ?
Wenn du einen const_iterator verwendest, kannst du ersmal grundsätzlich überhaupt nichts ändern. :-o
zb. Habe ich hier eine Funktion die mir die Farbe ändert. aber wenn ich das mache dann bekomm ich irgendwas
Es kommt mit Sicherheit nicht "irgendwas". Genaue Fehlermeldung kopieren! Und die relevanten Codefragmente wären sicherlich auch hilfreich.

Bitte verwende die Code-Tags! Danke.

Gruß
 
Hallo,

Danke dir für den Input :). Genau das war es. Und sorry das ich nicht die CodeTags benutzt habe.

also ich habe es jetzt so gelöst:

Code:
bool ObjectManager::UpdateStringObject(int i_ID,sf::Color i_SetColor)
{

    for(std::list<GameObjectList>::iterator it = ObjectList.begin(); it != ObjectList.end(); ++it)
	{
		if(it->ID == i_ID)
		{
			it->ObjectInstance.StringObject.SetColor(i_SetColor);

		}
	}
	

	return LIST_SUCESS;
}

Jetzt Kann ich die Funktion aufrufen und die Farbe des Objects ändern, funktioniert Prima :)

lg

und danke dir nochmal
 
Zurück