PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dynamische Liste mit wählbaren Datentyp


Einfachkrank
2004-07-16, 21:39:53
Hi,

ich hab mich grade gefragt, wie ich es hinbekomme eine unabhängige Liste als Klasse zu programmieren, die ich dann für einen beliebigen Datentyp nutzen kann.

Beispiel:
class Krabbelwesen
{
public:
int AnzahlBeine;
char info[50];
};

class Fliegetierchen
{
public:
int Reichweite;
int Spannweite;
int Schlafzeit;
};Und jetzt möchte ich eine Klasse haben, die eine allgemeine Liste darstellt und ich kann mir mit dieser dann zwei Listen anlegen in der ich Krabbelwesen und Fliegetierchen speichern kann...

MFG Einfachkrank

Gnafoo
2004-07-16, 22:00:44
In der stl ist sowas bereits enthalten:


#include <vector>
using namespace std;

// ..

int main(void)
{
vector<Krabbelwesen> bla;
vector<Fliegetierchen> bla2;

Krabbelwesen a, b;
Fliegetierchen c;
bla.push_back(a);
bla.push_back(b);
bla2.push_back(c);

cout << bla.back().AnzahlBeine << endl;
cout << bla[0].AnzahlBeine << endl;
cout << bla2.back().Reichweite << endl;

return(0);
}


Such einfach mal nach stl und vector mit Google .. dann wirst du mit Sicherheit ein paar Tutorials bzw. die Doku finden. (Es gibt da auch noch andere Containerklassen, die sich alle etwas unterscheiden, aber vector ist für die meisten Fälle die richtige)

Wenn du das selber machen willst, musst du dafür Templates benutzen. Nach diesem Schema:

// ...

template<class T>
class List
{
public:
List(void) : mpData(0), mNumItems(0) {}
virtual ~List(void)
{
free(mpData);
mpData = 0;
}

void addItem(T item)
{
mNumItems++;
mpData = (T*)realloc(mpData, sizeof(T)*mNumItems);
mpData[mNumItems-1] = item;
}

void delItem(int i)
{
// item löschen
// items drüber runterkopieren
// ...
}

T operator[](unsigned int i)
{
assert(i<mNumItems);
return(mpData[i]);
}

protected:
T* mpData;
unsigned int mNumItems;
};


Habs nicht compiliert und getestet, also sind vielleicht kleine Fehler drin .. aber ich denke das Prinzip ist klar.

cu DerTod

Einfachkrank
2004-07-19, 12:05:05
Gut, das Prinzip hab ich eigentlich verstanden. Aber ich weiß noch nicht genau was ein Template ist... Kann man das nicht auch irgendwie als void* Zeiger schreiben?

Xmas
2004-07-19, 15:27:40
Original geschrieben von Einfachkrank
Gut, das Prinzip hab ich eigentlich verstanden. Aber ich weiß noch nicht genau was ein Template ist... Kann man das nicht auch irgendwie als void* Zeiger schreiben?
Man kann schon, ist allerdings nicht sehr schön, und die Liste kann nur Referenzen statt Kopien halten. Wenn du nicht genau weißt, was ein Template ist -> lernen ;) Mit Google wirst du bestimmt was finden.

mrdigital
2004-07-19, 18:38:25
Original geschrieben von Einfachkrank
Gut, das Prinzip hab ich eigentlich verstanden. Aber ich weiß noch nicht genau was ein Template ist... Kann man das nicht auch irgendwie als void* Zeiger schreiben?

Thinking in C++

http://www.mindview.net/Books/TICPP/ThinkingInCPP2e.html

Einfachkrank
2004-07-27, 17:21:40
Ich hab noch en Problem, was nicht direkt hier mit zu tun hat, aber mir hierdurch mal wieder aufgefallen ist :)

Was hat es genau mit namespace zu tun? Ich hab schon en bischen im Netz gesucht, aber versteh noch nicht ganz den eigentlich Sinn...

Corrail
2004-07-27, 17:32:39
Namespaces sind ein einfaches Feature um Namenskonfikte zu vermeiden. Man kann mit Namespaces Klassen, Variablen, ... in eigene Pakete stecken. Man muss dan expliziet auf diese Pakete zugreifen (so ähnlich wie bei Klassen):


namespace my_namespace
{
int my_var = 5;
}

void main()
{
my_var = 10; // geht nicht, da my_var nicht erkannt wird
my_namespace::my_var = 10; // geht, da ich explizit my_namespace verwende
using namespace my_namespace;
// ab hier sind alle Elemente von my_namespace auch global
my_var = 10; // geht, da ich my_namespace verwende
}


Hier genaueres dazu:
http://www.cplusplus.com/doc/tutorial/tut5-2.html