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

Peppie

Frischling

  • »Peppie« ist der Autor dieses Themas

Beiträge: 18

Wohnort: Mainz!

Beruf: FIAE

  • Private Nachricht senden

1

26.03.2009, 16:14

[Erledigt] Klassenvererbung "dynamisch" - mini-Eng

Moin Moin,

meine Idee, ich habe für mein Spiel folgende Klassen die meine Engine representieren:
  • cGameEngine
  • cGFXEngine
Die cGFXEngine ist in der cGameEngine eine private Membervariable*. So das die logik immer in verbindung mit der GrafikEngine steht.

Jetzt nur mal angenommen, ich möchte das Spiel um eine weitere GrafikLib erweitern, SDL und OpenGL. Folgende Überlegung kam mir da:


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
// Interfaceklasse / Abstract

class iGFXInterface
{
      public:
      virtual void drawTriangle() = 0;
};

// SDL Klasse

class cSDLEngine: public iGFXInterface
{
      public:
      inline virtual void drawTriangle(){ cout << "SDL::drawTriangle()" << endl; }
};

// OpenGL Klasse

class cOGLEngine: public iGFXInterface
{
      public:
      inline virtual void drawTriangle(){ cout << "OGL::drawTriangle()" << endl; }
};

// Grafik Engine

template <class __T>
class GFXEngine : public __T
{
};

Ich muss die GrafikEngine jetzt nach folgendem prinzip aufrufen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(int argc, char *argv[])
{
    GFXEngine<cSDLEngine> *Engine1 = new GFXEngine<cSDLEngine>();
    GFXEngine<cOGLEngine> *Engine2 = new GFXEngine<cOGLEngine>();
    
    
    Engine1->drawTriangle();
    Engine2->drawTriangle();
    
    _getch();
    
    delete Engine1;
    delete Engine2;
    
    return 0;
}


Mein Problem ist hier der Datentyp von Engine1 oder Engine2, da ich dort schon FEST angeben muss um welche GFXEngine es sich handelt. Besser fände ich, wenn es so aussehen würde:

(PseudoCode)

C-/C++-Quelltext

1
2
3
GFXEngine *Engine1 = new GFXEngine<cSDLEngine>();
// oder so

GFXEngine *Engine1 = new GFXEngine( cSDLEngine );

Gibt es irgendwie eine andere Möglichkeit von der Klasse zu erben als diese Templatevariante die ich euch hier geschrieben habe?


Thx euch

Anonymous

unregistriert

2

26.03.2009, 16:18

Nope, nur über viel Arbeit und das rentiert sich in deinem Fall nicht. Benutz besser Enums bei der Übergabe und nicht den Klassennamen. Stichwort: Factory-Pattern.

Peppie

Frischling

  • »Peppie« ist der Autor dieses Themas

Beiträge: 18

Wohnort: Mainz!

Beruf: FIAE

  • Private Nachricht senden

3

26.03.2009, 16:20

Alles klar, danke dir ;-)

4

26.03.2009, 16:29

C-/C++-Quelltext

1
2
iGFXEngine *Engine1 = new cSDLEngine;
iGFXEngine *Engine1 = new cOGLEngine;

Oder habe ich da noch etwas falsch verstanden?

Peppie

Frischling

  • »Peppie« ist der Autor dieses Themas

Beiträge: 18

Wohnort: Mainz!

Beruf: FIAE

  • Private Nachricht senden

5

26.03.2009, 16:36

Also das mit den Factory-Pattern sieht schon so aus wie ich es mir vorstelle aber gerne höre ich mir auch andere Vorschläge an, wie würde denn bei dir iGFXEngine aussehen?

6

26.03.2009, 16:44

Das ist ein Copy&Paste Problem und leider nicht ganz richtig. Ersetze iGFXEngine durch iGFXInterface:

C-/C++-Quelltext

1
2
iGFXInterface *Engine1 = new cSDLEngine;
iGFXInterface *Engine1 = new cOGLEngine;

Anonymous

unregistriert

7

26.03.2009, 16:45

Also ich würd mir da mal was von COM abkupfern:

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
78
79
80
81
// Interfaces für Graphics.

namespace graphics
{
    // Mögliche Typen.

    enum device_type
    {
        sdl,
        opengl,
        direct3d
    }

    // Basis-Klasse für Devices.

    class device
    {
        // [...]

        
        virtual texture* create_texture (...) = 0;
        
        // [...]

    };
    
    // Basis-Klasse für Texturen.

    class texture
    {
        // [...]

    };
}

// [...]


// Implementierungen.

namespace graphics
{
namespace impl
{
    class sdl :
        public graphics::device
    {
        // [...]

    };
    
    class opengl :
        public graphics::device
    {
        // [...]

    };
    
    class direct3d :
        public graphics::device
    {
        // [...]

    };
}
}

// Device erstellen.

graphics::device* create_device (graphics::device_type type)
{
    switch (type)
    {
    // SDL-Implementierung ist angefordert.

    case graphics::device_type::sdl:
        return new (graphics::impl::sdl ());
        
    // OpenGL-Implementierung ist angefordert.

    case graphics::device_type::opengl:
        return new (graphics::impl::opengl ());
        
    // Direct3D-Implementierung ist angefordert.

    case graphics::device_type::direct3d:
        return new (graphics::impl::direct3d ());
    }
    
    return (nullptr);
}

// OpenGL-Device erstellen.

graphics::device* device = create_device (graphics::device_type::opengl);

// Textur erstellen.

graphics::texture* texture = device->create_texture (...);

Peppie

Frischling

  • »Peppie« ist der Autor dieses Themas

Beiträge: 18

Wohnort: Mainz!

Beruf: FIAE

  • Private Nachricht senden

8

26.03.2009, 16:53

Ich glaub ich nehm die "kleine faule" Variante von King *lach* dabei dacht ich mir schon das es relativ einfach gehen müsste, hatte nur ein Blatt vor den Augen :shock:

Zitat von »"King"«

Das ist ein Copy&Paste Problem und leider nicht ganz richtig. Ersetze iGFXEngine durch iGFXInterface:

C-/C++-Quelltext

1
2
iGFXInterface *Engine1 = new cSDLEngine;
iGFXInterface *Engine1 = new cOGLEngine;



trotzdem danke

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

26.03.2009, 19:52

Womit du den eigentlichen Sinn eines Interfaces verstanden hast :D. Denn wozu sonst sollte man ein Interface definieren ;)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Peppie

Frischling

  • »Peppie« ist der Autor dieses Themas

Beiträge: 18

Wohnort: Mainz!

Beruf: FIAE

  • Private Nachricht senden

10

26.03.2009, 21:14

Naja ich hab noch nicht viel mit Interfaces gemacht, dacht mehr an so eine art "Regelwerk" so wie die DTD bei einem HTML Dokument ;-)

Werbeanzeige