JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Template - Typübergabe

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 25.11.2004, 14:46    Titel: Template - Typübergabe Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 25.11.2004, 15:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 25.11.2004, 16:07    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 25.11.2004, 16:15    Titel: Antworten mit Zitat

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? Wink
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 25.11.2004, 16:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 25.11.2004, 16:38    Titel: Antworten mit Zitat

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 Wink
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 25.11.2004, 16:44    Titel: Antworten mit Zitat

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 Wink


Jo, so hatte ich das auch gemacht, war bloß n bisschen schlampig in meinem letzten Post... Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
xardias
JLI Master


Alter: 39
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 25.11.2004, 18:25    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 25.11.2004, 18:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
xardias
JLI Master


Alter: 39
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 26.11.2004, 15:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 26.11.2004, 15:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 26.11.2004, 16:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
xardias
JLI Master


Alter: 39
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 26.11.2004, 20:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 26.11.2004, 20:34    Titel: Antworten mit Zitat

Hmz... ich werds wohl doch durch nen Vererbungmechnismus lösen... scheint mir jetzt am sinnvollsten... Wink
Danke für die Tipps und die Mühe... Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 26.11.2004, 22:38    Titel: Antworten mit Zitat

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 Rolling Eyes )

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum