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

11

12.08.2007, 21:00

;) void* ist nur damit man übergeben kann was man will ...

Hab es jetzt einfach so gelöst:

C-/C++-Quelltext

1
inline static base* instance(base* ptr = NULL) { static base* _inst = ptr; if (_inst == NULL) throw std::runtime_error("no instance"); return _inst; }
... beim 1. Aufruf übergibt man die Klasse dann ...

C-/C++-Quelltext

1
2
3
4
5
6
 int WinMain(...)
{
    derived inst;
    base::instance(&inst);
    base::instance()->send_message(AE_RENDER, NULL);
}
...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

12

12.08.2007, 21:17

Ich weiß nich genau was deine Ansprüche sind, aber ich finde das komplette Design nicht besonders toll...
@D13_Dreinig

13

12.08.2007, 21:49

Hmm meine Ansprüche sind rel. merkwürdig ;) Es soll zum einen nur eine Instanz von einem Objekt erstellt werden können ... es soll von der Klasse aber dennoch die Möglichkeit eine Klasse abzuleiten ... diese soll dann auch genutzt werden anstelle von der Basisklasse ... es soll die Möglichkeit bestehen, dass man nicht ableiten muss.
Das hab ich in der Funktion drin. Man erstellt in der WinMain bzw. main eine Instanz des Objektes und übergibt die der Funktion instance ... und schon hab ich alles was ich brauche :) Ich kann ableiten ... instance gibt dann halt einen Zeiger auf die abgeleitete Klasse zurück ... ich hab eine Instanz ... ich muss nicht ableiten ... ich kann auch einfach eine Instanz der Base-Klasse erstellen und an die Funktion übergeben :)
... wenn ich Langeweile habe, packe ich das noch in eine Funktion damit es schöner aussieht :D
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

14

13.08.2007, 08:31

Das ist dann aber eher nicht der richtige Fall für das Singletonpattern.:)
@D13_Dreinig

15

13.08.2007, 14:22

Ja ich weiß ... ist jetzt nicht wirklich mehr ein Singleton ... kann z.B. ja auch nicht verhindern das mehrere Instanzen der Klasse existieren usw. ... nja
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

16

13.08.2007, 15:13

Sagmal, funktioniert das bei dir wirklich?

C-/C++-Quelltext

1
 derived() : m_int(0) { register_message(AE_RENDER, &derived::on_render); }


Mein g++ mag das nämlich nicht.
@D13_Dreinig

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

17

13.08.2007, 15:17

visual studio schlägt das sogar vor ^^
funktioniert bei mir aber nicht.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

18

13.08.2007, 15:29

Zu deinem Problem:

du könntest etwas in Richtung des "named constructor" idioms machen:

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
struct uncopyable
{
protected:
    uncopyable() {}
    ~uncopyable() {}

private:
    uncopyable( const uncopyable& );
    uncopyable& operator=( const uncopyable& );
};

struct base : protected uncopyable
{
    typedef void ( base::*memfun_ptr )( const void* );

    typedef std::map< std::size_t, memfun_ptr > list_type;
    typedef list_type::iterator iterator_type;

    static base* create()
    {
        static int instances = 0;

        assert( !( instances++ ) && "zu viele instanzen" );

        static base inst;
        return &inst;
    }
    
    void register_msg( std::size_t id, memfun_ptr handler )
    {
        list[ id ] = handler;
    }

    void call_msg( std::size_t id, const void* data )
    {
        iterator_type it( list.find( id ) );

        if ( it != list.end() )
            ( this->*( it->second ) )( data );
    }

private:
    std::map< std::size_t, memfun_ptr > list;
};

struct derived : base
{
    static derived* create()
    {
        static int instances = 0;

        assert( !( instances++ ) && "zu viele instanzen" );

        static derived inst;
        return &inst;
    }

    void test( const void* data )
    {
        std::cout << "calling derived::test()\n";
    }

    void foo( const void* data )
    {
        std::cout << "calling derived::foo()\n";
    }
};

int main()
{
    base* a = base::create();

    derived* c = derived::create();
}


Damit kannst du dann auf Klassenebene regeln wieviel Objekte erzeugt werden sollen. Die geschützte Ableitung von "uncopyable" erlaubt dann auch das kopieren von Objekten nicht (weshalb create() leider keine Referenz oder Kopie zurückgeben darf). Naja, ist nicht unbedingt die Optimallösung, aber ganz ohne Templates ist das etwas schwer! :)
@D13_Dreinig

19

13.08.2007, 15:30

Hab gerade keine Zeit deinen Vorschlag durchzulesen ... sieht aber gut aus ... und ja er nimmt es VC++2005 ... muss de nur nen static_cast vor setzen ;) Is ja von base abgeleitet ... da geht sowas :)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

20

13.08.2007, 15:32

Weiß ich doch! :P Ich hab mich nur gewundert weil in deinem Code kein Cast vorhanden war. :)
@D13_Dreinig

Werbeanzeige