Du bist nicht angemeldet.

Werbeanzeige

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 870

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

1

24.08.2005, 16:43

Statische Template Klassen

Hi also ich hab mir eine Template Klasse geschrieben für das Managen von Speicherverbrauchenden Sachen, also zB für Effekte, Modelle usw.. Jetzt hab ich das Problem das ich nicht weiß wie ich davon Instanzen erstellen soll wenn die ja egtl statisch sein sollen.. Gibt es da eine Möglichkeit oder mach ich die Template Klasse lieber doch nicht statisch und arbeite statt dessen lieber mit Singletons?

Dave

Alter Hase

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

2

24.08.2005, 16:56

da du templates verwendest scheinst du mit c++ zu arbeiten. mir ist deine frage nicht ganz klar. erstens gibt es meines wissens nach keine statischen klassen in c++ und falls es diese gäbe ist es klar, dass man davon keine instanzen erstellen kann, da sie statisch sind :confused:
statische klassen werden beim programmstart automatisch und einmalig instanziiert und danach ist es nicht mehr möglich weitere instanzen dieser klasse zu erstellen. bei singletones wird dieses verhalten künstlich durch einen privaten konstruktor herbeigeführt.
kannst du deine frage vllt umformulieren? hoffe obiges hilft trotzdem, auch wenn ich die frage nicht verstehe ;)

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

3

24.08.2005, 17:26

Singleton.

Ich glaub wer die Suche benutzt findet einen Thread wo ich mich regelrecht über Davids statische Klassen im Buch aufgeregt habe und warum man Singleton benutzen sollte.

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 870

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

4

24.08.2005, 19:01

Zitat von »"Dave"«

statische klassen werden beim programmstart automatisch und einmalig instanziiert und danach ist es nicht mehr möglich weitere instanzen dieser klasse zu erstellen.


Das war ja mein Problem.. demnach gibt es eigentlich keine statischen Templateklassen oder?
Ich werds dann mal mit Singletons machen..

statische klassen gibts in c++ übrigens.

Anonymous

unregistriert

5

24.08.2005, 19:13

Das was du mit statisch meinst ist wohl der Aufbau wie die Klassen in Davids Buch, aber das ist wirklich nicht schön, nimm Singletons (Scott-Meyers singleton für single-threaded Anwendungen und double-checked singletons für multi-threaded Anwendungen), wie auch schon gesagt :)

Und mit Templates hat das ja nichts direkt zu tun, du kannst dir allerdings templates zu Nutze machen und ne singleton-klasse entwerfen von der du nur noch ableiten musst.

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

6

24.08.2005, 19:29

Spik)evil(
Ja gibt es in C++, aber wenn Du damit nem Profi gegenübertrittst der haut dich regelrecht in den Bode. Denn die sind absolut nicht gerne gesehen, fast genau so ungerne wie goto

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 870

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

7

24.08.2005, 20:33

Ok kann ich verstehen, aus dem Gesichtspunkt, dass statische Klassen sowas wie ne globale Variable sind, die einfach den Code unübersichtlich machen. Aber Singletons funktionieren doch im Prinzip genauso...

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 870

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

8

24.08.2005, 20:50

Also das Problem was ich jetzt halt habe ist folgendes: Ich hab mir ne super mulitfunktionale Template-Klasse gebaut, die für das Managen von Unterschiedlichen Klassen zuständig ist, aber ich brauch von der halt mehrere Instanzen: einmal für Models, einmal für Effekt usw. Jede Instanz muss aber von überall her aufrufbar sein, so wie Singletons oder statische Klassen. Nur: wenn ich jetzt für jeden Fall einen Singleton einbaue hab ich ja nichts mehr von der Dynamik der templates, weil dann muss ich im Prinzip ja doch wieder für jeden Fall eine eigene Klasse definieren.. Da muss es doch ne bessere Möglichkeit geben..

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

9

24.08.2005, 20:54

Spik)evil(
Na, da ist ein etwas größerer Unterschied schon da. Das was ihr macht ist eigentlich eine vergewaltigung einer Klasse und sollte wenn mit namespaces gehandhabt werden.

Gegen eine Statische Klasse sagt keiner was, aber gegen die statischen Funktionen, die sind gegen eine Statische Klasse oft unberechenbar.

Man sollte es einfach sein lassen. Nimm Dir den Meyers Singleton aus Effective C++ Programming und fertig :)

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 870

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

10

24.08.2005, 21:26

Also ich hab das folgendermaßen gelöst: (falls als kommentar scheiße kommt bitte mit Begründung^^) Funktioniert im Prinzip ähnlich wie mit Singletons, nur das nicht nur eine Instanz erzeugt wird, sondern soviele wie nötig.. Ich habe also anstelle des Singletons meinen Speichermanager eingebaut.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
template <class T>
struct STListEntry
{
    T*                      Object;
    char*                   pcObjectPath;
    char*                   pcAddInf1;
    char*                   pcAddInf2;

    inline STListEntry() {Object = NULL; pcObjectPath = NULL, pcAddInf1 = NULL, pcAddInf2 = NULL;}
    inline ~STListEntry() {delete Object; delete[] pcObjectPath; delete[] pcAddInf1; delete[] pcAddInf2;}
};

//*****************************

template <class T>
class TMemoryManager
{
private:
    STListEntry<T>* pObjectList;
    int             iObjectCount;

public:
    T* GetEntry(char* pcObjectPath, char* pcAddInf1, char* pcAddInf2)
    {
        //Die Liste durchgehen

        for (int i = 0; i < iObjectCount; i++)
            if (pObjectList[i].pcObjectPath == pcObjectPath)
                //Sind die ZusatzInfos identisch, bzw egal (== NULL)

                if ((pcAddInf1 == NULL || pObjectList[i].pcAddInf1 == pcAddInf1)
                    && (pcAddInf2 == NULL || pObjectList[i].pcAddInf2 == pcAddInf2))
                    //dann gefundenes Objekt zurückgeben

                    return pObjectList[i].Object;
        //ansonsten kein Objekt übereinstimmend:

        return NULL;
    }

    void InsertEntry(T* Object, char* pcObjectPath, char* pcAddInf1, char* pcAddInf2)
    {
        iObjectCount++;
        pObjectList = tbMemReAlloc(pObjectList, iObjectCount*sizeof(STListEntry<T>));
        pObjectList[iObjectCount].Object = Object;

        //Zuweisen der Strings:

        pObjectList[iObjectCount].pcObjectPath = new char[255];
        pObjectList[iObjectCount].pcAddInf1 = new char[255];
        pObjectList[iObjectCount].pcAddInf2 = new char[255];
        strcpy(pObjectList[iObjectCount].pcObjectPath, pcObjectPath);
        strcpy(pObjectList[iObjectCount].pcAddInf1, pcAddInf1);
        strcpy(pObjectList[iObjectCount].pcAddInf2, pcAddInf2);
    }

    //Setzt vorraus, dass die chars zugewiesenen Speicher haben, im Normalfall char* = new char[255]

    void GetChars(T* Object, char* pcObjectPath, char* pcAddInf1, char pcAddInf2)
    {
        for (int i = 0; i < iObjectCount; i++)
            if (Object == pObjectList[i].Object)
            {
                strcpy(pcObjectPath, pObjectList[i].pcObjectPath);
                strcpy(pcAddInf1, pObjectList[i].AddInf1);
                strcpy(pcAddInf2, pObjectList[i].AddInf2);
                break;
            }
    }

    void Release()
    {
        tbMemFree(pObjectList);
    }
};

//*******************************************************

class CEffectManager : public TMemoryManager<tbEffect>
{
};

class CModelManager : public TMemoryManager<tbModel>
{
};

Werbeanzeige