Listen in "C++"

Programmieren in C++
Antworten
Autor
Nachricht
KidPaddle
8 Bit
Beiträge: 265
Registriert: So Mai 14, 2006 12:18
Wohnort: Bayern

Listen in "C++"

#1 Beitrag von KidPaddle » Mi Dez 26, 2007 09:42

Hallo,

ich bin eigentlich ein Pascal/Delphi - Programmierer. Dort existiert in einer Klassenbibliothek eine Objektliste, welche nach außen die Objekte, wie in einem Array, unabhängig dessen Types, verwaltet und nach dem zerstören der Liste auch die Objekte automatisch wieder freigibt.

Dazu muss man wissen, das in Pascal/Delphi Objekte immer nur Zeiger sind und nie auf dem lokalen Stack abgelegt werden. Beim übergeben eines Objektes an Funktionen wird keine Kopie übergeben, sondern nur die Referenz auf das Objekt. Für die Freigabe des Objektes ist immer der Programmierer verantwortlich.

Nun versuche ich in C++ eine Liste mit Objekte zu verwalten. Dabei sollen die Objekte in der Liste automatisch zerstört werden. Habe diverse Möglichkeiten gefunden, nur sind diese Möglichkeiten immer auf ein bestimmten Objekttyp möglich. Eine Mischung von Väter- und Kindklassen ist in diesen Beispielen nicht möglich.

Hat jemand eine Klasse, in der ich einfach Objekte einfügen, herausnehmen und durch iterieren kann und das am Ende die eingefügten Objekte automatisch wieder freigibt? Dabei soll eine Mischung von Objekten, welche von einem Basistyp abgeleitet sind, möglich sein.

Gruß
Thomas

Benutzeravatar
G.o.D
8 Bit
Beiträge: 354
Registriert: Mo Jan 15, 2007 15:52
Wohnort: Koenigreich Bayern
Kontaktdaten:

#2 Beitrag von G.o.D » Mi Dez 26, 2007 15:59

Wirf mal einen Blick auf die Standard Template Library:

http://www.cplusplus.com/reference/stl/

vector, list und map duerften die fuer dich am interessantesten sein. Damit muesstest du das eigentlich abdecken koennen.
Bild
Das deutschsprachige Painter Forum

KidPaddle
8 Bit
Beiträge: 265
Registriert: So Mai 14, 2006 12:18
Wohnort: Bayern

#3 Beitrag von KidPaddle » Mi Dez 26, 2007 18:48

Leider nicht. Diese haben das Problem, das immer eine Kopie des Objektes abgelegt wird. Und wenn man Pointer auf die Objekte in der Liste speichert, werden die in der Liste gespeicherten Objekte nicht freigegeben. Zu dem können diese Listen immer nur eine Objektklasse verwenden, das speichern abgeleiteter Klassen ist nicht möglich.

Dazu gibt eine Menge Informationen und Tricks wie man die eine oder andere Beschränkung umgeht, Stichwort z. B. auto_ptr, aber das funktioniert immer nur für genau eine Klasse.

Leider sind die Beispiele meistens trivial und bisher habe ich keine Beispiele gefunden, wie man mehr als nur eine Art einer Klasse in einem <vector> oder <list> speichern kann.

Gruß
Thomas

Benutzeravatar
purestrain
7 Bit
Beiträge: 165
Registriert: Mi Feb 28, 2007 19:30

#4 Beitrag von purestrain » Do Dez 27, 2007 15:52

Hallo,

Von einer Standardliste ableiten und den Destruktor entsprechend implementieren.

Sehr zweifelhaft, das Objekte im Heap automatisch beim zerstoeren einer Liste geloescht werden. Entweder Stack (automatische bereinigung beim verlassen des gueltigkeitbereichs) oder Heap (keine automatische bereinigung).

Und seit wann kann man in den STL-Collections keine abgeleiteten Klassen hinzufuegen?

just my 2 cents

endless90
3 Bit
Beiträge: 9
Registriert: Fr Jan 15, 2010 18:50

Re: Listen in "C++"

#5 Beitrag von endless90 » Fr Jan 15, 2010 18:56

€dit: SORRY HAB NICHT GESEHEN DAS DER FRED SCHON SOOOOO ALT IST :D
hoffe es hilft aber trotzdem irgendwem :-D

wieso machst du es nicht ungefähr so.

Code: Alles auswählen

#include <vector>

class Object
{
	public:
		int X,Y;
	private:
};

class Subobject
{
	public:
		int Z,A;
	private:
};


class Objectmanager
{
	public:
		void AddObject(Object* Obj)
		{
			Objectvector->push_back(&Obj);
		}
		void CleanUp()
		{
			while(Objectvector->size()>0)
			{
				delete Objectvector->back();
				Objectvector->pop_back();
			}
		}
		
	private:
		vector<Object*>* Objectvector;

};

int main()
{
	Objectmanager OBJECTM;
	
	OBJECTM.AddObject(new Object());
	OBJECTM.AddObject(new Subobject());

	return 0;
}
kann nicht garantieren das es jetzt auf anhieb funzt. habs ausm kopf geschrieben. aber so auf die art lös ich das auch immer. gruß michi

Benutzeravatar
Evil Azrael
6 Bit
Beiträge: 109
Registriert: Mi Jan 20, 2010 22:14
Wohnort: Rheinkilometer 666 & hinter Heidelberg
Kontaktdaten:

Re: Listen in "C++"

#6 Beitrag von Evil Azrael » Di Mär 16, 2010 20:57

Ihr macht's kompliziert... dafür gibt's shared pointert, beispielsweise fertig von Boost
http://www.boost.org/doc/libs/1_42_0/li ... ed_ptr.htm
War, War never changes... The end of the world occurred pretty much as we had predicted. Too many humans, not enough space or resources to go around. The details are trivial and pointless, the reasons, as always, purely human ones. A great cleansing, an atomic spark struck by human hands, quickly raged out of control, spears of nuclear fire rained from the skies, continents were swallowed in flames and fell beneath the boiling oceans....

God bless Germany! Bild

Antworten

Zurück zu „C++“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste