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

CBenni::O

1x Contest-Sieger

  • »CBenni::O« ist der Autor dieses Themas

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

1

19.02.2010, 22:10

Resourcen-Manager - Verschiedene Typen behandeln?

Hallo,

Ich möchte einen Resourcen-Manager erstellen.
Dabei stieß ich auf das Problem, dass es verschiedene Typen von Resourcen gibt (Bilder, Musik, Videos etc. pp)

Natürlich könnte ich meine Resource-Manager Klasse als Template erstellen, und dann eben für jeden Typ einen erstellen. Ich denke aber, dass dies keine sonderlich schöne Lösung ist.

Dann habe ich überlegt, ob man eventuell void*-Arrays/Vektoren/Maps verwenden kann. Das hat soweit geklappt, aber wenn man einen void*-Pointer löscht, wird der Destruktor des ursprünglichen Objektes nicht ausgelöst... Wie löst man das/ bzw. gibt es andere Möglichkeiten?

Danke schonmal im Voraus ;)

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

BlazeX

Alter Hase

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

2

19.02.2010, 22:29

Hast du schonmal an new und delete gedacht? ;)

CBenni::O

1x Contest-Sieger

  • »CBenni::O« ist der Autor dieses Themas

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

3

19.02.2010, 22:38

Klar, aber wenn du einen void*-Pointer hast, geht sämtliche Information über den Typ verloren. Wenn du nun 'delete ptr;' aufrufst, kann der Compiler nicht wissen, welchen Destruktor er aufrufen soll.
Glaub mir, ich hab es probiert. Der Speicherplatz wird freigegeben (Laut vld), aber der Destruktor nicht.

z.b.:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>

class foo
{
public:
    foo()
    {
        std::cout << "Konstruktor aufgerufen" << std::endl;
    }
    ~foo()
    {
        std::cout << "Destruktor aufgerufen" << std::endl;
    }
};

int main()
{
    void* bar = new foo();
    delete bar;
    return 0;
}


Bildschirmausgabe:

Zitat

Konstruktor aufgerufen


Ist es klar genug?

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

4

19.02.2010, 22:44

Hast du schon probiert den Destruktor virtuell zu machen?
Man muss ja auch keinen void Zeiger nehmen, sondern könnte für jede Ressource eine gemeinsame Oberklasse fordern. Dann sollte das mit dem Destruktor eigentlich gehen.
Lieber dumm fragen, als dumm bleiben!

CBenni::O

1x Contest-Sieger

  • »CBenni::O« ist der Autor dieses Themas

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

5

19.02.2010, 22:46

Nein... Ich probiers gleich mal aus...
Nein, das macht keinen Unterschied...

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

idontknow

unregistriert

6

19.02.2010, 22:46

iirc kann man den destruktor auch explizit aufrufen, aber ich glaube wenn du deine daten auf void* runter abstraktierst machst du so oder so design mäßig eine rießen fehler!

Bin gerade dabei genau das selbe zu lößen und hab nach dem zweiten anlauf templates verwendet.
Beim ersten mal wollte ich auch alles in einer einzigen Map speichern und wirklich nur einen Manager verwenden.

hab das dann ca. so gelößt:

C-/C++-Quelltext

1
2
3
4
5
6
7
// abstrakte resourcen klasse:

class Resource
{
   virtual bool load(std::string path) = 0;
   virtual void release() = 0);
   // [...]

}


Damit eben eine Klasse geschaffen die eine lade und release methode hat die selbst virtuell ist und erst implementiert werden muss. Damit arbeitet dann der Manager er weiß nicht wirklich was für ein Typ deine Resource hat nur eben dass es eine Resource ist (schönere version deiner void pointer aber denke auch keine optimallößung).
alternativ könntest du nen enum mit einbauen, dass den typ angibt und z.b. anhand der dateiendung den typ bestimmen nur so als randbemerkung!

Hoffe das war jetzt einigermaßen verständlich deine einzelnen resourcen typen leitst du dann von resource ab und implementierst erst dort die lade methode. dadurch kann dein manager auf jede methode/attribut dass du in Resource definierst zugreifen und über diese klasse kannst du dann deine resourcen vereinheitlichen :)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

19.02.2010, 22:47

Du kannst eine Basisklasse für alle Resourcen bereitstellen:

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
class Resource
{
public:
  virtual ~Resource() = 0;
};

inline Resource::~Resource() {}

// ...


class Image : public Resource {};
class Music : public Resource {};
class Video : public Resource {};

// ...


class ResourceManager
{
  std::vector<Resource*> ResourceList_t;

private:
  ResourceList_t mResources;  
};

CBenni::O

1x Contest-Sieger

  • »CBenni::O« ist der Autor dieses Themas

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

8

19.02.2010, 22:48

Gut, da ich sowieso die SFML verwende, werde ich die Tatsache ausnutzen, dass es die Basisklasse sf::Resource<T> gibt...

Gibt es dennoch noch andere möglichkeiten?

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

19.02.2010, 22:49

Zitat von »"CBenni::O"«

Gut, da ich sowieso die SFML verwende, werde ich die Tatsache ausnutzen, dass es die Basisklasse sf::Resource<T> gibt...

Gibt es dennoch noch andere möglichkeiten?

mfg CBenni::O


Dann beschreib eben mal _was_ genau du haben willst und _was_ dich an dem Vorschlag stört.

idontknow

unregistriert

10

19.02.2010, 22:50

Was für Möglichkeiten willst du denn? :P

Ich denke außer der bereits genannten und Templates wird es nicht sonderlich viel geben was zudem noch sinnvoll ist!

Werbeanzeige