2016-05-09 7 views
0

zurückgeben Ich plane, eine ResourceManager-Klasse in meine gameengine zu schreiben, damit ich meine Bilder, Musik, Modelle und so weiter leicht verwalten kann.Vorlagenwert von DLL-Klasse

Klasse wie:

class ResoureManager{ 
std::map<cstring path,T> resources; 
public: 
<T> get(char path[]); 
} 

Die Idee war einfach (nur ein, wie es dann funktioniert): Bei der Lagerung alles in einem großen Behälter, und schicken Sie das Objekt über den Weg. Mein Problem ist jetzt, dass ich eine Klasse mit einem Vorlagencontainer verwenden muss, damit ich in Zukunft verwalten kann, was ich will. Mein Hauptproblem hier ist die ::get(char path[]) Funktion, die das Objekt zurückgeben sollte. So weit, so gut, ich kann einige Arten für den Export einführen, aber gibt es irgendwelche Alternativen, die ich nehmen kann?

ich MSVS Gemeinschaft bin mit 2015

+0

Aus Ihrem (gebrochenen) Codebeispiel ist nicht klar, was genau Sie wollen. Aber vielleicht möchten Sie [Boost.Any] (http://www.boost.org/doc/libs/1_59_0/doc/html/any.html) (es würde den Platz Ihres 'T' einnehmen) als ein Mittel zum Speichern von Objekten unterschiedlicher Art. Oder vielleicht, wenn alle Ihre Ressourcen leicht in/aus einer String-Repräsentation konvertiert werden können, ist [Boost.PropertyTree] (http://www.boost.org/doc/libs/1_59_0/doc/html/property_tree.html) auch ein Möglichkeit? – mindriot

Antwort

0

Sie scheinen ein Objekt vom Typ T zurückkehren zu wollen (wo der Typ „on the fly“) bestimmt wird. So funktionieren Vorlagen in C++ nicht.

Eine Vorlage, wie alles andere in einem C++ - Programm, ist Eingabe an den Compiler. Es wird so viele Arten von std::map<cstring,T> für so viele Arten von T als Sie Instanziieren erstellen. T ist nur ein Platzhalter für einen von Ihnen angegebenen Typnamen.

Ihre get Funktion scheint von der Art zurück T, was auch immer es ist. Das ist ein altes Problem, so alt, dass es von Anfang an in C++ geschrieben wurde: Vererbung, virtuelle Funktionen und RTTI. Klassischerweise definieren Sie einen Typ - nennen wir ihn resource_t - und leiten daraus Klassen ab. Jede abgeleitete Klasse implementiert denselben Satz von Funktionen. Sie definieren Ihre Karte a zu halten resource_t * und, mirabile dicu, rufen Sie die Funktion passend zu seinem tatsächlichen (abgeleiteten) Typ durch den Zeiger. So implementiert C++ den OO-Begriff Polymorphismus.

Im Gegensatz zu einigen dynamischen Sprachen, die Sie vielleicht kennen, wird in C++ die gesamte Verdrahtung von Funktionsname zu Objekttyp zur Kompilierzeit bestimmt. Das Programm entdeckt zur Laufzeit nie, dass eine bestimmte Funktion nicht implementiert ist. Es ist entweder da oder es ist ein Kompilierungsfehler.

Wenn Sie versuchen, die von Ihnen zur Verfügung gestellte Skizze auszuarbeiten, werden Sie schnell feststellen, dass sie nicht kompiliert wird und nicht so funktionieren kann, wie sie impliziert. C++ hat Mechanismen, um zu tun, was Sie wollen. Die beste Sache, die ich empfehlen kann, ist ein gutes Buch und einige Stunden, die ein Verständnis von ihnen entwickeln.

+0

Vielen Dank, dass Sie sich Zeit für diese Antwort genommen haben. Ich weiß, dass es nicht funktioniert und ich bin mit diesem Thema vertraut (Ja, das bin ich wirklich). In einigen verschiedenen Template-Klassen (in meiner DLL) habe ich die Instanziierung bisher verwendet und es hat super funktioniert. Ich wollte nur fragen, ob es andere Möglichkeiten gibt, so etwas zu implementieren. –