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

1

11.08.2007, 23:16

base::Singleton<base>, derived::base ... wie?

// Problem erkannt. Siehe unten!
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

2

11.08.2007, 23:32

Versteh ehrlich gesagt nicht, was du meinst :D
Mein Projekt: Rise of the Sylvan

3

12.08.2007, 00:37

// Problem erkannt. Siehe unten!
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

4

12.08.2007, 00:43

Hmm ... durch TRACEn hab ich heruasgefunden, dass der Konstruktor der Klasse derived nicht aufgerufen wird ... wie könnte man das lösen?
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

5

12.08.2007, 00:51

Werd meinen Singleton verändern müssen ...

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
#if !defined (RC_SINGLETON_H__INCLUDED)
#define RC_SINGLETON_H__INCLUDED

#if (_MSC_VER > 1000)
#pragma once
#endif 

namespace realcay
{
    template <class T>
    class RCWINDOW_API Singleton
    {
    public:
        inline static T& instance() { static T inst; return inst; }
        
    protected:
        Singleton();

        public:
        Singleton(const Singleton&);
        Singleton& operator=(const Singleton&);
    };
};
#endif // RC_SINGLETON_H__INCLUDED
scheint nicht sauber zu funktionieren wenn man 2x ableitet:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
class base : public realcay::Singleton<base> {};
class derived : public base 
{
public:
    derived() : m_int(0) {} // wird nicht aufgerufen

private:
    int m_int;
};
...
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 Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

12.08.2007, 09:05

Und welcher Konstruktor wird nun nicht aufgerufen?

7

12.08.2007, 09:51

Nja ... also war gestern etwas müde ... das Problem ist, dass ich sowohl die Möglichkeit brauche die Klasse base direkt zu nutzen, als auch davon abzuleiten ...

Zitat

Und welcher Konstruktor wird nun nicht aufgerufen?
derived ...

Ist aber eigentlich auch klar ... weil ja ein base-Objekt in instance angelegt wird ...
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

8

12.08.2007, 10:23

Also jetzt nochmal:
Ich hab halt mein Singleton-Template (s.o.). Dann nutze ich innerhalb einer DLL die Klasse base die von diesem Singleton-Pattern abgeleitet ist.

C-/C++-Quelltext

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

class base : public realcay::Singleton<base> 
{
    typedef void (base::*EventHandler)(const void*);

private:
    std::map<std::size_t, EventHandler> m_Hndls;

public:
    void send_message(std::size_t id, const void* data) 
    { 
        std::map<std::size_t, EventHandler>::iterator it = m_Hndls.find(id);
        if (it != m_Hndls.end()) (*this.*it->second)(data);
    }
    void register_message(std::size_t id, EventHandler hdnl) 
    { m_Hndls[id] = hdnl; }
};

Nun soll der Benutzer der DLL aber auch hingehen können und von base ableiten können um eine eigene Message in der std::map eintragen zu können (wie ihr vllt sehr handelt es sich dabei um einen Memberfunktionszeiger auf base::*func.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
class derived : public base
{
public:
     derived() : m_int(0) { register_message(AE_RENDER, &derived::on_render); }

private:
     void on_render(const void* data) { std::cout << m_int << std::endl; }

private:
    int m_int;
};

So ... nun wird ja aber im durch das Singelton-Template der Konstruktor der Klasse base aufgerufen ... derived aber natürlich nicht! Wie kann ich das umgehen? Hätte auch einfach eine Template-Klasse aus base machen können und als default-Parameter dann base ... geht allerdings nicht weil wenn ich ja base in der DLL selbst brauche und ich da noch nicht weiß, wie die abgeleitete Klasse heißen wird ...

Steh da glaube ich etwas aufm Schlauch ... jemand eine Idee?
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

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

9

12.08.2007, 13:59

Ich befürchte, so wie du dir das vorstellst, wird das einfach nicht funktionieren.
Warum?

In der DLL willst du einfach die Klasse Base verwenden => du erzeugst in der DLL bereits einen Singleton<Base>.

In der Client Anwendung willst du nun aber einen Singleton<Derived>, dass ist aber ein anderer Klassentyp => dieses Objekt muss auch erst wieder konstruiert werden und genau da liegt das Problem, denn einen Singleton darf es nur 1 mal geben! Das was du willst, geht mit Singletons einfach nicht. Ich glaube auch nicht, dass man das irgendwie umgehen kann.

mfg Philipp

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

12.08.2007, 19:05

Omg, was hast du überhaupt vor? Da grauts einem ja... "void* etcpp"!
@D13_Dreinig

Werbeanzeige