Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

FreezingEngine

Treue Seele

  • »FreezingEngine« ist der Autor dieses Themas

Beiträge: 280

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

1

09.12.2013, 22:38

Problem mit std::map und Template Klassen

Hey Leute,
also ich versuche grad einen Art von Manager für alle Datentypen zu schreiben - im Fokus hatte ich eigentlich
einen Manager für alle Arten von Ressourcen aus der SFML (Texturen,Fonts,Sounds, etc.).

Das Gerüst und alles steht nur habe ich Probleme bei speichern und verwalten der verschiedenen Instanzen.
Mein erster Gedanke war eine Map zu erstellen die als ersten Key ein String mit dem Typen bzw. der Art der Instanz hat,
also "Font" etc. und als zweiter Key wieder eine Map die als ersten Key eine ID für die Instanz hat , z.B."Arial", und als zweiter Key dann
die Template Klasse die stellvertretend für die Instanz ist.

Hoffe das war jetzt nicht all zu verwirrend hier nochmal ein bischen Code:

C-/C++-Quelltext

1
2
    template <class _Type>
    std::map<std::string ,std::map<std::string ,_Type>> mRessourceMap;


Leider lässt sich das ganze nicht kompilieren:
1>c:\users\marcel\documents\visual studio 2010\projects\visualdata\visualdata\VisualDataManager.hpp(35): fatal error C1001: Interner Compilerfehler.
1> (Compilerdatei "msc1.cpp", Zeile 1420)
1> Vereinfachen oder ändern Sie das Programm im Umfeld der oben aufgeführten Positionen.

Und irgendwie hab ich jetzt ne Denkblockade , deswegen wollte ich mal fragen ob jemand spontan ne Idee hat
wie man das ganze sonst noch realisieren könnte oder ob jemand einfach nur ein paar Tipps hat :)

MfG Marcel
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

2

09.12.2013, 23:12

MSDN
Google ist schon toll.

MfG
Check

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

10.12.2013, 00:31

@Checkmateing:
Das hilft hier aber auch nicht wirklich weiter.

Ich würde empfehlen einen aktuellen Compiler wie Visual C++ 2012 oder 2013 zu benutzen.
Wahrscheinlich wurde der Fehler dort behoben.

4

10.12.2013, 01:42

Zitat von »FreezingEngine«

Hoffe das war jetzt nicht all zu verwirrend hier nochmal ein bischen Code:

C-/C++-Quelltext

1
2
template <class _Type>
std::map<std::string ,std::map<std::string ,_Type>> mRessourceMap;

Wenn ich dich richtig verstanden habe, dann wird das so nicht funktionieren, wie du dir das vorstellst. Die Container in C++ sind ja homogen, d.h. jeder Container enthält Objekte eines bestimmten Typs. Nach deiner Beschreibung wäre das in deinem Code allerdings nicht mehr der Fall, denn die inneren Maps sollen jeweils einen anderen Datentypen enthalten: sf::Texture, sf::SoundBuffer, sf::Shader usw. Dadurch ist die äußere Map nicht mehr homogen.

Du müsstest an dieser Stelle für die inneren Maps Type Erasure betreiben, damit du sie in demselben Container speichern kannst. Beispielsweise mithilfe einer gemeinsamen Basisklasse:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class TypeErasedMapWrapper
{
    public:
        virtual ~TypeErasedMapWrapper = default;
    protected:
        TypeErasedMapWrapper() = default;
};

template <typename ResourceType>
class MapWrapper : public TypeErasedMapWrapper
{
    std::map<std::string, ResourceType> mResources;
};

std::map<std::string, std::unique_ptr<TypeErasedMapWrapper>> mResourceMap;


Mir stellt sich aber noch die Frage, ob du die mResourceMap überhaupt brauchst? Du könntest die Ressourcen ja auch einfach in einzelnen Maps speichern:

C-/C++-Quelltext

1
2
3
std::map<std::string, sf::Texure> mTextures;
std::map<std::string, sf::SoundBuffer> mSoundBuffers;
// ...

5

10.12.2013, 08:42

Naja, man könnte auch boost::any benutzen:

http://www.boost.org/doc/libs/1_55_0/doc/html/any.html

Die Frage ist halt wirklich, ob man das will. Irgendetwas mit einem Container zu machen, von dem man gar nicht weiß, welche Objekte er enthalten kann ist halt auch nicht wirklich angenehm.
Wenn du Ressourcen verwalten willst, wäre eine gemeinsame Basisklasse als Ressourcenverwalter ja vielleicht durchaus angebracht.
Lieber dumm fragen, als dumm bleiben!

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

10.12.2013, 09:31

Wenn ich dich richtig verstanden habe, dann wird das so nicht funktionieren, wie du dir das vorstellst.
Mit einer Interface-Klasse für Ressourcen wäre das kein Problem.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

7

10.12.2013, 13:52

Mit dem Code würdest du nicht eine "map" die verschiedene Typen annehmen kann definieren sondern viele "maps" theoretisch eine für jeden Typ.
Das ist aber kein gültiges C++ weil Variablen keine Templates sein können. (Bzw. nicht bis C++14 und dann auch nur in Speziallfällen(constexpr))
Mir scheint, du hast noch nicht ganz die Funktionsweise von Templates verstanden. Im Prinzip werden von einen Konstrukt mit Templateparametern immer für jede verwendete Variante der Parameter eine eigene Instanz des Templates erzeugt.
Außerdem ist es auch keine gute Idee die Art der Ressourcen in einem assoziativen Container zu speichern, weil zur Compilezeit bekannt ist welche Typen es gibt. Außerdem geht die Typsicherheit flöten und es gibt erst zu Laufzeit einen Fehler wenn du versehentlich "font" statt "Font" geschrieben hast.

Sinnvoll wäre meiner Meinung nach, folgende Umsetzung: (Nur der Ansatz und nicht vollständig)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
template<typename ResourceType>
class Resource
{
public:
    ResourceType Object;
};

template<typename ResourceType>
class ResourceContainer
{
private:
    std::map<std::string, Resource<ResourceType>> Resources;
public:
    Resource<ResourceType>& operator[](const std::string& Name)
    {
        return this->Resources[Name];
    }
    void Add(const std::string& Name, Resource<ResourceType>&& NewObject)
    {
        this->Resources[Name] = NewObject;
    }
};



class ResourceManager
{
     ResourceContainer<sf::Font> Fonts;
     ResourceContainer<sf::Texture> Textures;
     //...
};

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (10.12.2013, 19:00)


Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

8

10.12.2013, 17:16

Zumindestens früher hatten manche Compiler Probleme mit >> und ein Leerzeichen hat geholfen ...
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

9

10.12.2013, 18:15

In C++11 funktionieren doppelte spitze Klammern garantiert und auf dem MSVC schon länger.
Weil es auf Kosten der Lesbarkeit geht und der gänigen Konvention für Klammern widerspricht, würde ich auf das Leerzeichen verzichten.

FreezingEngine

Treue Seele

  • »FreezingEngine« ist der Autor dieses Themas

Beiträge: 280

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

10

10.12.2013, 18:30

Also erstmal danke an alle die geantwortet haben!
Immerwieder schön zu sehen das man sich auf das Forum verlassen kann :)

@David: Ja wird höchste Zeit , aber würde das auch weiterhelfen? - probieren kann mans ja.

@BlueCobold: Wenn ich jetzt hingehe und für die Ressourcen erstmal eine Templateklasse schreibe die nur ein Templateobjekt beinhaltet,
und diese dann in bereits bestehende Maps einfüge kann ich doch auch direkt mehrere Maps für die jeweiligen Typen schreiben oder?
Meinst du das so , wie Spiele Programmierer es gepostet hat?

Also ich hatte ja vor, den Manager nicht explizit für Ressourcen der SFML zu schreiben sondern rein theoretisch ein Manager für alles,
sonst hätte ich ja direkt einfach nur pro Resource eine Map erstellen können^^
Probleme wie das man statt "Font" , "font" kann man ja abfangen oder gar selbst verarbeiten und ändern^^


Zitat

Mir scheint, du hast noch nicht ganz die Funktionsweise von Templates verstanden. Im Prinzip werden von einen Konstrukt mit Templateparametern immer für jede verwendete Variante der Parameter eine eigene Instanz des Templates erzeugt.


Ist mir durchaus bewusst, arbeite nicht das erste mal mit Templates - doch gab es nochnie den Fall das ich eine Map habe die mehrere Maps verwaltet wobei in der zweiten dann Templateklassen verwaltet werden^^
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

Werbeanzeige