CPP Pointer Templates auf Klassen

tr0nix

tr0nix

der-mit-dem-tux-tanzt
Hallo zusammen

Ich habe eine OpenGL Initialisierungsklasse gebastelt. Dazu kommen jetzt noch ein paar Klassen für Primitives (z.B. Quader) welche alle aus der Klasse "glsprite" vererbt werden mit einigen Grundlegenden Methoden wie die Position des Modelles.

Was ich nun brauche ist eine Art Pointer, welcher auf alle glsprite vererbten Klassen verweisen kann um so einzelne Methoden dieser Klassen aufzurufen wie z.B. das "sich selber zeichnen".

Das sollte doch mit templates machbar sein oder? Eine Art Template-Pointer welcher auf einen "glcube : glsprite" oder "glpyramid : glsprite" verweisen kann um dort jeweils die Methode "drawCode()" aufzurufen.

Hat mir jemand einen Anhaltspunkt?

Gruss
Joel
 
warum benutzt du nicht einfach nur die oberklasse als typ um auf die verbten objekte zu verweisen???
 
Ne das geht ned. Da kann ich ja max. auf ein Objekt zeigen aber ich werde dynamisch Memory alloziieren wo sich mehrere Objekte vom selben Typ befinden die ich mittels Arrayindex zugreifen muss.

glcube ist aus glsprite vererbt:
Code:
glcube *testobjekte;
testobjekte = new glcube[100];
glsprite *pointer;
pointer = testobjekte;

Jetzt wäre aber pointer[2] != testobjekte[2] da die Objekte nicht dieselbe Grösse haben!
 
ja so ein problem hatte ich auch schonmal...
aber ich muss mir das programm raussuchen *such* *such*
naja vl. finde ichs bald....

btw: habs zwar nit probiert aber, das müsste ja einen speicherfehler geben oder? wenn man dann auf testobjekte zugreifen würde, da die anderen objekte größer sind...
 
Hi Heady

Mh ich denke nicht unbedingt, jedenfalls nicht, wenn man nur auf das erste Objekt zugreift.

Mal ein Speicherabbild machen (nur für die Theorie).
glsprite ist dabei 4 Bytes gross, glcube 2 Bytes. Zusammen ist ein "richtiges" glcubes Objekt also 6 Bytes.

Ein glcube[2] würde also folgendermassen aussehen:
Code:
0x00 glsprite
0x04 glcube
0x06 glsprite
0x0A glcube

Würde man nun einen glsprite Pointer machen könnte man _meines Erachtens_ (ich bin kein Profi, nur Theoretiker!) sofern man auf 0x00 zeigt mit den glsprite Methoden arbeiten. Würde man den Pointer jedoch inkrementieren käme man auf den glcube-Code bei 0x04 was in einem Chaos enden würde.

Da ich in glsprite bisher sowieso nur x,y,z Koordinaten gespeichert habe + eine virtuelle Methode die durch die Kindsklasse implementiert werden muss (virtual void drawCode(void) = 0), würde mich dies jedoch leider auch nicht weiter bringen :o/.

Gruss
Joel

P.S. wenn du den Code finden würdest wär natürlich ganz kewl ;o)
 
Hallo,

Deine angestrebte Lösung ist hoch problematisch und endet früher oder später definitiv in einer Zugriffsverletzung. Wenn Du eine Menge Objekte unterschiedlicher Art verwalten willst, alloziiere ein Zeigerfeld und alloziiere ein Objekt in jedem Eintrag:
Code:
glsprite** pointers = new glsprite* [100];

for (unsigned int i=0; i < sizeof (pointers)/sizeof( glsprite*); i++)
{
    pointers[i] = new glirgendwas( );
}

Zugriff auf i-tes Objekt mit virtueller Methode virtual void drawCode():
Code:
    pointers[42]->drawCode( );

Deutlich eleganter ist die Verwendung vorgefertigter Containerklassen (z. B. std::vector<glsprite*>) und RTTI (dynamic_cast<...>). Das bedeutet heutzutage auch keine Performanceeinbußen mehr.
 
Zuletzt bearbeitet:
Zurück
Oben