Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 25.11.2004, 14:46 Titel: Template - Typübergabe |
|
|
Hi @all,
gibt es eine Möglichkeit, eine Templateklasse, welche einen Typ bei der Initialisierung erwartet, zu benutzen, ohne den Typ angeben zu müssen?
Ich hoffe dieser Beispielcode verdeutlicht mein Problem:
Code: | template<typename T> class blabla {
...
};
blabla* getTemplate(){
return &Temp;
} |
Der Compiler erwartet natürlich bei der Verwendung eines Templates, dass der Typ T mit angegeben wird, was ja auch logisch ist, nur gibt es eine Möglichkeit dies zu umgehen? |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 25.11.2004, 15:56 Titel: |
|
|
Wofür brauchst du das denn? Vielleicht gibts ja auch eine bessere Lösung.
Und wo willst du dann den Typ angeben, zur Laufzeit?
Dann könntest du z.B. unions verwenden, die einen Speicherbereich ohne festen Typ reservieren. In deiner Klasse solltest du dann eben noch eine Variable haben, die den Typ (als String o.ä.) speichert.
Aber ich weiß jetzt auch nicht, ob das für dein Problem die eleganteste Lösung ist... _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 25.11.2004, 16:07 Titel: |
|
|
Für einen "dynamischen" Ressourcenmanager...
So hatte ich mir das vorgestellt:
http://www.rafb.net/paste/results/c52ge012.html
Ressourcen sollten dann in dieser Form angelegt werden:
ressource<bablablubb> ManagerBlablablubb("bla");
So wollte ich auf die Ressourcen zugreifen:
res_manager::getInstance()->getRessource("bla")...
Vererbung halte ich in diesem Fall klar für die schlechtere Variante... =/ |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 25.11.2004, 16:15 Titel: |
|
|
GreveN hat Folgendes geschrieben: | Ressourcen sollten dann in dieser Form angelegt werden:
ressource<bablablubb> ManagerBlablablubb("bla");
So wollte ich auf die Ressourcen zugreifen:
res_manager::getInstance()->getRessource("bla")... |
Ja, das sollte aber eigentlich auch normal mit Templates gehen. Bekommst du Kompilerfehler? Wenn ja, welche?  _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 25.11.2004, 16:23 Titel: |
|
|
Das Problem liegt bei der res_manager Klasse, ich leg' z.B. in der Klasse eine
Code: | std::map<std::string, ressource> |
an, der Compiler erwartet aber, dass bei Verwendung der Templateklasse ressource, der Typ T mit angegeben wird, also in der Form:
Code: | std::map<std::string, ressource<blabla> > |
Da liegt das Problem... =/
Hier mal die genauen Fehlermeldungen:
Zitat: | c:\developing\microsoft visual studio\myprojects\opengl_engine\ve_ressource.h(42) : error C2955: 'ressource' : use of class template requires template argument list
c:\developing\microsoft visual studio\myprojects\opengl_engine\ve_ressource.h(22) : see declaration of 'ressource'
c:\developing\microsoft visual studio\myprojects\opengl_engine\ve_ressource.h(42) : fatal error C1903: unable to recover from previous error(s); stopping compilation
VE_core.cpp
c:\developing\microsoft visual studio\myprojects\opengl_engine\ve_ressource.h(42) : error C2955: 'ressource' : use of class template requires template argument list
c:\developing\microsoft visual studio\myprojects\opengl_engine\ve_ressource.h(22) : see declaration of 'ressource'
c:\developing\microsoft visual studio\myprojects\opengl_engine\ve_ressource.h(42) : fatal error C1903: unable to recover from previous error(s); stopping compilation
Error executing cl.exe. |
|
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 25.11.2004, 16:38 Titel: |
|
|
Ach so...
Ich bin mir jetzt nicht ganz sicher, aber geht es vielleicht, wenn du anstatt nur 'ressource' der Map einen Zeiger auf ressource übergibst?
Ich hatte mal ein ähnliches Problem, aber ich weiß gerade nicht mehr, wie ich es gelöst habe. Ich schau einfach mal nach  _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 25.11.2004, 16:44 Titel: |
|
|
The Lord of Programming hat Folgendes geschrieben: | Ach so...
Ich bin mir jetzt nicht ganz sicher, aber geht es vielleicht, wenn du anstatt nur 'ressource' der Map einen Zeiger auf ressource übergibst?
Ich hatte mal ein ähnliches Problem, aber ich weiß gerade nicht mehr, wie ich es gelöst habe. Ich schau einfach mal nach  |
Jo, so hatte ich das auch gemacht, war bloß n bisschen schlampig in meinem letzten Post...  |
|
Nach oben |
|
 |
xardias JLI Master

Alter: 39 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 25.11.2004, 18:25 Titel: |
|
|
Ich würde resourcen eigentlich nicht als template klasse designen.
Für sowas eignet sich normalerweise einfache Vererbung mit einem abstrakten interface wesentlich besser. |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 25.11.2004, 18:34 Titel: |
|
|
Hmz... ich fands halt nur z.B. doof, dass wenn ich einfache Daten, z.B. Texturen ('GLuint') etc. speichern will, so jedesmal eine entsprechende Klasse ableiten müsste... =/ |
|
Nach oben |
|
 |
xardias JLI Master

Alter: 39 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 26.11.2004, 15:15 Titel: |
|
|
Aber auch die müssen geladen werden. du kannst nicht eine Textur gluint und eine soudndatei gleich laden. wenn du das direkt in einzelne klassen packst hast du mehr übersicht und alle ladeprozeduren getrennt. |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 26.11.2004, 15:29 Titel: |
|
|
Hm... laden wollte ich die sowieso nicht dort, sondern lediglich speichern... =/
So, dass praktisch alle Daten (Texturen, Sounds... ) an einer Stelle vorliegen und ich dann einfach auf das gewünschte Element zugreifen kann...
Bestünde eine Möglichkeit, mein Problem mit Hilfe von void-Zeigern zu lösen?
Hier nochmal der komplette Code, wie ich es bis jetzt umsetzen wollte:
http://www.rafb.net/paste/results/d7IGNa41.html |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 26.11.2004, 16:28 Titel: |
|
|
Hättet ihr denn einen anderen Vorschlag, wie man einfach, einen flexiblen, schnellen Manager implementieren könnte?
Man sollte einfach und effizient, beliebige Arten von Daten darein packen und mit ihnen arbeiten können... =/ |
|
Nach oben |
|
 |
xardias JLI Master

Alter: 39 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 26.11.2004, 20:22 Titel: |
|
|
Zitat: | res_manager::getInstance()->getRessource("bla")... |
sowas wird nicht funktionieren.
Woher soll C++ wissen, welche art von daten du nun grad auslesen willst?
Natürlich köntnest du das über void zeiger machen, aber auch dann musst du den typ immer noch mit angeben, nämlich beim casten.
Eine andere möglichkeit wäre es den einfach mehrere globale instanzen von deinem Manager zu erzeugen:
Code: | extern res_manager<Gluint> textureManager;
extern res_manager<blabla> blablaManager; |
aber über eine instanz auf verschiedene arten zuzugreifen halte ich für keien gute idee. Was ist denn, wenn du versucht seine textur Gluint auszulesen die angegebene resource aber aus versehen eine soung datei ist? Da kommste in teufels küche *g* |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 26.11.2004, 20:34 Titel: |
|
|
Hmz... ich werds wohl doch durch nen Vererbungmechnismus lösen... scheint mir jetzt am sinnvollsten...
Danke für die Tipps und die Mühe...  |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 26.11.2004, 22:38 Titel: |
|
|
GreveN hat Folgendes geschrieben: | Bestünde eine Möglichkeit, mein Problem mit Hilfe von void-Zeigern zu lösen? |
Ja das ginge auch.
(Wieso hab ich das vorhin net geschrieben )
Dann musst du aber aufpassen, dass du immer in den korrekten Typ type-castest. Sonst kanns AFAIK auch zu Laufzeitfehlern kommen. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
|