PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : abstrakte dynamische Liste über Templates?


del_4901
2004-06-06, 02:36:42
Kann mir einer mal erklären wie ich eine dynamische Liste über Templates so handeln kann, das ich jedes beliebige Objekt in die Liste einhängen kann.

Also ich will eine abstrake Klasse Liste haben die ich dann an z.B Verticelist etc. vererbe. Wenn ich mir nun ein Objekt von Verticelist erstelle kann ich Vertices einhängen ... ich will aber noch andere Unterklassen von Liste erstellen, so das ich im Quelltext nur noch an Liste was ändern muss, und nicht in allen Listen. z.B ich will später aus den Listen einen Bäume machen.

Kann mir da mal jemand pls in C++ eine Schnittstelle oder so definieren? So das ich mich nur noch um das ausprogrammieren der eigendl. Listenfunktionen kümmern muss.

Abe Ghiran
2004-06-06, 02:49:43
N'abend...
Gibt es irgendeinen Grund dafür, das Rad neu zu erfinden? Ansonsten würde ich einfach was passendes aus der stl nehmen, z.B. vector.

Grüße, Jan

del_4901
2004-06-06, 02:58:28
jo das hab ich schon überlegt mit stl, und vector, aber das ist mir dann nicht erweiterbar genug, wie gesagt es könnte sein das ich aus der Liste später nen Baum machen will etc. und soweit ich weiß kann vector nur listen verwalten. Ausserdem brauch ich doch blos eine set und get Methode. vector ist mir da ein bischen zuviel overkill, alles so Zeugs das man nie braucht. (glücklicherweise schmeißt der compiler das nicht benutzte ja raus, aber erst mal sind die vielen Methoden mir zu unübersichtlich)

Abe Ghiran
2004-06-06, 03:31:42
Hmm, der Unterschied zwischen Liste und Baum kann natürlich schon ziemlich groß sein, z.b. beim durchlaufen.

Wenn du aber wirklich nur simples get / set brauchst, kannst du ja einen stl vector in einem selbstgeschriebenen template wegkapseln, daß nur diese beiden Methoden bereitstellt.
Das lässt sich erst mal recht fix implementieren und wenn du mit vector irgendwann unzufrieden bist kannst du die interne Art der Speicherung ändern, ohne daß sich die äußere Schnittstelle verändert.

Beim schreiben eines solchen templates kann ich dir jetzt leider wenig helfen, da habe ich selber nicht so den Durchblick :( (außerdem ruft mich gerade mein Bett).

Aber ich stell mir das in etwa so vor (keine Ahnung, ob die Syntax 100% ok ist!):


#include <vector>

using namespace std;

template<class C> class Buffer{

public:

void add(const C& c);

void remove(const C& c);

private:
vector<C> contents;
};


Grüße, Jan

DocEW
2004-06-06, 04:27:13
Original geschrieben von AlphaTier
Kann mir einer mal erklären wie ich eine dynamische Liste über Templates so handeln kann, das ich jedes beliebige Objekt in die Liste einhängen kann.

Also ich will eine abstrake Klasse Liste haben die ich dann an z.B Verticelist etc. vererbe. Wenn ich mir nun ein Objekt von Verticelist erstelle kann ich Vertices einhängen ... ich will aber noch andere Unterklassen von Liste erstellen, so das ich im Quelltext nur noch an Liste was ändern muss, und nicht in allen Listen. z.B ich will später aus den Listen einen Bäume machen.

Kann mir da mal jemand pls in C++ eine Schnittstelle oder so definieren? So das ich mich nur noch um das ausprogrammieren der eigendl. Listenfunktionen kümmern muss.

Ich verstehe nicht, was du noch mit der Vererbung anfangen willst. Wenn du ein Template machen willst, kannst du doch jeden beliebigen Datentyp in der Liste speichern!
Wenn dir das mit dem Template zu kompliziert ist, kannst du ja erstmal eine Liste machen, die z.B. Strings speichert. Je nachdem wie du's machst brauchst du dann die eigentliche Listenklasse und z.B. noch eine Klasse "Listenelement" oder so, die einen Zeiger auf die Daten hat und einen Zeiger auf das nächste Listenelement in der Liste.
Wenn das soweit läuft kannst du eigentlich die Template-Funktionalität sehr einfach ergänzen, indem du die Klasse eben formal zum Template machst (Syntax weiß ich jetzt nicht auswendig, jedenfalls steht dann irgendwo <Data*> oder so...) und dann überall "string" durch "Data" ersetzt!

...hoffe meine Konzentration hat um diese Uhrzeit noch gereicht, sodaß das nicht alles Blödsinn ist! =)

del_4901
2004-06-06, 07:50:52
öhm Vererben will ich deswegen, weil es außer den ganzen vertexlisten etc. noch ne Materialliste gibt, die hat eine spezielle Methode, nämlich getName // name des Materials.
Jedenfalls funkt es nun ;) ... nachdem ich alles in den Header geschmissen hab (stand in meinem schlauen Buch).


#ifndef TLISTE_H
#define TLISTE_H

template <class T>
class Node
{
public:
Node(T pT)
{
pNext = 0;
Data = pT;
}

Node<T>* pNext;
T Data;
};


template <class T>
class Tliste
{
protected:

Node<T>* pFirst;
Node<T>* pLast;
Node<T>* pCurrent;
int nElements;

public:
Tliste();

void add(T Data)
{
Node<T>* pNode = new Node<T>(Data);
if(pLast)
{
pLast->pNext = pNode;
}
pLast = pNode;

if(pFirst == 0)
{
pFirst = pNode;
}
nElements++;
}


T operator [] (int Index)
{
pCurrent = pFirst;
for(int n = 0; n < Index; n++)
{
pCurrent = pCurrent->pNext;
}

return ((pCurrent->Data));
}

};

template <class T>
Tliste<T>::Tliste()
{
pFirst = pLast = (Node<T>*)0;
pCurrent = (Node<T>*)0;
nElements = 0;
}

#endif


Das mit der Vererbung sieht dann in etwa so aus:


class texcoordlist : public Tliste<Vector2f>
{
};

für die einfachen Listen bei der Materialiste kommt die getName Methode noch zw. die {}; Das code ich aber später aus ... bett ist angesagt ... öhm und das ich in Tliste noch nicht jeden Fehler abgefangen habe, möge man mir verzeihen. Ist dumm wenn man auf einen zu großen index zugreift, aber ich bin jetze zu faul die 1 zeile zu ergänzen.

DocEW
2004-06-06, 12:24:49
Original geschrieben von AlphaTier
Jedenfalls funkt es nun ;) ... nachdem ich alles in den Header geschmissen hab (stand in meinem schlauen Buch).
Das klingt irgendwie nach Visual Studio 6, da funktionieren Templates bei mir auch nur, wenn alles im Header steht...

Corrail
2004-06-06, 14:21:25
Original geschrieben von DocEW
Das klingt irgendwie nach Visual Studio 6, da funktionieren Templates bei mir auch nur, wenn alles im Header steht...

Das ist nicht nur in VS 6.0 so. AFAIK müssen alle Template-Sachen in einem Header stehen und dürfen NICHT in einer CPP Datei sein. Das hast den Grund weil der Kompiler, wenn ein Template benutzt wird, den Code ja für jeden Typ generiert und dazu braucht er alle Infos zu der Template-Klasse. Bin mir damit nicht so ganz sicher, aber ich glaub das ich das mal irgendwo so gelesen hab.

D-Swat
2004-06-06, 19:17:40
templates müssen komplett im Header deklariert werden bzw. es muß zur compile-zeit die komplette template Klasse verfügbar sein, nicht nur die deklaration.
Eigentlich gib es dafür in C++ Standard das export keyword.
Nur leider wird es von keinem Compiler bisher unterstützt und deswegen muss man halt alles im Header implementieren.

[Ontopic]
Warum nicht std::vector und std::map verwenden?
map verwendet intern einen Baum um die Daten zu verwalten.

del_4901
2004-06-06, 19:47:01
Original geschrieben von D-Swat
templates müssen komplett im Header deklariert werden bzw. es muß zur compile-zeit die komplette template Klasse verfügbar sein, nicht nur die deklaration.
Eigentlich gib es dafür in C++ Standard das export keyword.
Nur leider wird es von keinem Compiler bisher unterstützt und deswegen muss man halt alles im Header implementieren.

[Ontopic]
Warum nicht std::vector und std::map verwenden?
map verwendet intern einen Baum um die Daten zu verwalten.

ich will doch noch was zum vererben haben :)
meine Material Objekte muss ich dann nach dem namen des Materials durchsuchen, das brauch ich einerseits beim parsen, und andererseits wenn ich mal nen cgfx shader "einhängen" will, kann ich in Maya (nach meiner Konvention) sagen, nenn das Material, wie das Shaderfile, dann sucht der Parser gleich noch nach dem shader und initzialisiert die uniforms.

D-Swat
2004-06-06, 20:00:51
Was spricht dann gegen sowas?
typedef std::map<std::string,Material*> MaterialMap;
MaterialMap MyMaterials;