Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Factory Pattern - Self-registering

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.11.2012, 15:20 Uhr
TrAx1988



Hallo,

ich habe folgenden Wunsch:

Ich würde gerne mit Macros, z.B. "#define REGISTER_CLASS(CLASSNAME, PARENT)" innerhalb einer Klasse, die von einer anderen erbt, eine Instanz erzeugen und diese entsprechen in einen Vektor speichern.

Ich habe also einen Vektor von der Elternklasse, also "vector<CInput*> m_inputFacory;". Sobald eine Kindsklasse deklariert ist, und mann z.B. das Macro mit "REGISTER_CLASS(CInputKind, CInput), soll in der Factory davon eine Instanz erzeugt werden und in den Vektor gespeichert werden.

Ich habe mir schon ein paar Beispiele angeschaut, aber keines davon trifft auf meines zu.

Jemand eine IDee, wie man das am besten umsetzen kann?

Vielen Dank!

Gruß, Trax
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.11.2012, 20:12 Uhr
TOSHMAX



Stellt du das dir ungefähr so vor:

C++:
struct _RegisterTag;

class CInputKind
{
    public:
        CInputKind(_RegisterTag)
        {
            CInput::Register(*this);
        }
};

static CInputKind _Registered_CInputKind(_RegisterTag());

Falls nicht, was gefälllt dir daran nicht? Könntest du vielleicht ein Beispiel posten, wie du es gerne hättest?

Willst du das von CInputKind nur eine Instanz erzeugt werden kann oder soll jede neue gespeichert werden?

Dieser Post wurde am 15.11.2012 um 20:12 Uhr von TOSHMAX editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.11.2012, 08:38 Uhr
TrAx1988



Ich möchte, dass Nutzer der Library lediglich von der Klasse CInput ableiten müssen und dann eben via Macro die Klasse erzeugt wird und in einem Vektor gespeichert wird.

Also:


C++:
class CInput_Kind : public CInput
{
public:
     REGISTER_CLASS(CInput_Kind, CInput);

     CInput_Kind(void);
     ~CInput_Kind(void);

     ...
};




C++:
class public CInput
{
public:
     CInput();
     virtual ~CInput();

     ...
private:
     vector<CInput*> m_inputListener;
};



Die Instanz muss also in einer Factor erzeugt werden und in m_inPutListener hinzugefügt werden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.11.2012, 16:30 Uhr
TOSHMAX



Und was genau gefällt dir an der oberen Methode nicht? Die speichert auch eine Instanz in den vector, ein Macro ließe sich ergänzen. Ich verstehe gerade nicht auf was genau du hinaus willst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.11.2012, 10:38 Uhr
TrAx1988



Naja,

ich möchte dem Endnutzer (ausgenommen des Macros) keine weitere Implementierung nötig machen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.11.2012, 13:39 Uhr
TOSHMAX



Und was hältst du von dem hier:

C++:
class CInput
{
public:
     CInput() {}
     virtual ~CInput() {}

     void addListener(CInput* input)
     { m_inputListener.push_back(input); }

private:
     vector<CInput*> m_inputListener;
};

CInput gInput;

struct RegisterHelper {
    RegisterHelper(CInput* input)
    { gInput.addListener(input); }
};

#define REGISTER_CLASS(Class) RegisterHelper _Registered##Class(new Class)

Benutzbar zum Beispiel so:

C++:
class CInputKind : public CInput
{
public:
     CInputKind() {}
     virtual ~CInputKind() {}
};

REGISTER_CLASS(CInputKind);

Allerdings hält hier jede Kind-Klasse auch einen vector, der eigentlich nutzlos ist. Vielleicht finden wir eine einfachere Lösung, wenn du kurz beschreiben könntest, was du vor hast.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.11.2012, 20:47 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ich vermute du willst sowas in der art?

https://ssl.secure-hosts.de/www.fun-soft.de/showtopic.php?threadid=21429
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.11.2012, 17:30 Uhr
TrAx1988



@TOSHMAX

Das ist richtig. Wenn man aber daraus noch eine Factory nimmt (static), wäre das Problem damit auch geregelt.

Dein Beispiel hat mir weitergeholfen. Vielen Dank!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.11.2012, 17:31 Uhr
TrAx1988



Jetzt muss ich nur noch wissen, wie ich in dem o.g. Beispiel eine Instanz erzeugen kann.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.11.2012, 19:45 Uhr
TOSHMAX



Ich glaube jetzt habe ich verstanden, auf was du hinaus willst. Du willst also alle abgeleiteten Klassen in einem vector sammeln und später Instanzen von ihnen erstellen.

Mit dem obigen Beispiel könntest du es mithilfe eine weiteren virtuellen Funktion lösen, in der die abgeleitete Klasse dann ein eine Instanz von sich selbst erzeugt und zurück gibt. Das ist aber auch eine unsaubere Lösung, da du dann immer eine Instanz speicherst, die selbst nur als Factory dient.

Falls du eine wirklich gute Lösung suchst, solltest du dir den Thread ansehen, den FloSoft gepostet hat. Das ganze ist zwar etwas komplizierter aber definitiv die bessere, und auf lange Sicht auch die einfachere Methode.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: