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

Phil_GDM

Alter Hase

  • »Phil_GDM« ist der Autor dieses Themas

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

1

25.07.2006, 22:41

[Solved]Alexandrescu's factory-Objekte ohne Std-konstruktor?

Ich beschäftige mich momentan mit Design-Patterns.
Derzeit plage ich mich gerade mit der Factory von Alexandrescu.
Für jene die sie nicht kennen, hier der Code.

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
  template 
  <
    typename _abstract_product,
    typename _identifier_type,
    typename _product_creator = _abstract_product* (*)(),
    template<typename, typename> class _factory_error_policy = DefaultFactoryErrorHandler
  >
  class Factory : public _factory_error_policy<_identifier_type, _abstract_product>
  {
  protected:
    std::map<_identifier_type, _product_creator> associations_;
  public:
 
    bool registerObject(_identifier_type const& id, _product_creator creator)
    {
      associations_.insert(std::pair<_identifier_type, _product_creator>(
        id, creator));
      return true;
    }

    bool unregisterObject(_identifier_type const& identifier)
    {
      if(associations_.find(identifier) == associations_.end())
        return false;
      associations_.erase(identifier);
      return true;
    }
    
    _abstract_product* createObject(_identifier_type const& identifier)
    {
      std::map<identifier_type, _product_creator>::iterator i = 
        associations_.find(identifier);
      if(i != associations_.end())
      {
        return (i->second)();
      }
      return handleError(identifier);  //Must be defined by policy !!!

    }
  };


Registriert wird ein Objekt folgendermaßen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Register at factory!!!

namespace
{
  cenray::ILightSceneNode* createPointLightSceneNode()
  {
    return new cenray::PointLightSceneNode;
  }

  std::wstring const LIGHT_NAME = std::wstring(L"Point");

  bool const pointlight_registered = 
    cenray::LightSceneNodeFactory::instance().registerObject(LIGHT_NAME, 
    createPointLightSceneNode);

}


Die Factory ist ja schon schön und gut.
Das Problem das ich aber habe ist, dass ich ein Produkt immer nur mittels eines Standardkonstruktors instantiiert wird. Gibt es irgendeine möglichkeit, die Factory dahingehend zu erweitern, sodass man auch Objekte die keinen Standardkonstruktor besitzen erzeugen kann?

mfg Philipp

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

2

26.07.2006, 07:51

Du kannst natürlich in deinem __product_creator einen beliebigen Construktor aufrufen. Wenn du verschiedene brauchst, kannst du mehrere verschiedene Erzeuger mit unterschiedlichen IDs erzeugen, und dann immer das entsprechende Objekt erzeugen. Das ist aber immernoch recht statisch, weil das dann immer derselebe Konstruktor ist.

Wenn du bei createObject Parameter angeben willst, müssen die sich im operator () deines __product_creator wiederfinden, und zwar in allen: Sprich, alle Produkte müssen einen Konstruktor mit der gleichen Aufrufsignatur haben. Das schränkt die Sache meines Erachtens aber schon wieder zu sehr ein. Ausserdem muss dann das __product_creator Template-Argument ein anderes als das Default-Argument sein.

Ich würde empfehlen, für alle Objekte einen Default-Konstruktor bereitzustellen und diese hinterher mit einer speziellen Init-Methode (für jeden einzelne Klasse eine eigene) zu initialisieren. Ist aber auch wirklich schön, weil man dafür immer einen einen Cast auf das tatäschlich eben erzeugte Objekt braucht.

MfG,
Rainer

PS: Muss mein Design-Patterns Buch auch mal wieder anschauen. :)
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Phil_GDM

Alter Hase

  • »Phil_GDM« ist der Autor dieses Themas

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

3

26.07.2006, 11:17

Naja das mit einem anderen Product-Creator geht nicht so einfach, wegen:

C-/C++-Quelltext

1
2
3
...
return (i->second)();
...


Laut Andrescu kann man es aber irgendwie über Funktoren erreichen, dass man Parameter verwenden kann (hab aber keine Ahnung wie).

Das mit Default-Konstruktor und Init-Methoden ist wie schon erwähnt eben nicht die feine Englische.
Ich verwende meine Factory ja, um von der Implementierung des Interfaces unabhängig zu sein. Wenn ich jetzt aber wieder auf die Implementierung casten muss, dann habe ich wieder eien Abhängigkeit....

Hmm das Problem scheint nicht so einfach lösbar zu sein (wenn überhaupt möglich).
Falls ich was rausfinde werd ich mich melden.

mfg Philipp

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

4

26.07.2006, 12:30

Zitat von »"Phil_GDM"«


Laut Andrescu kann man es aber irgendwie über Funktoren erreichen, dass man Parameter verwenden kann (hab aber keine Ahnung wie).


Hehe, mit Funktoren kann man eine Menge Dinge machen, denn ja, damit kann man sowas erschlagen.

Du musst aber noch ein wenig mehr erzählen, was genau du machen willst und wobei dort das Problem liegt; mal schauen, ob ich dann eine bessere Idee habe.

Gruss,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Phil_GDM

Alter Hase

  • »Phil_GDM« ist der Autor dieses Themas

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

5

28.07.2006, 06:17

So ich hab endlich eine Lösung für mein Problem :D.
Das was die Factory in meinem Fall können soll, kann Alexandrescus Factory schon :roll:.Das ist im Buch jedoch nicht beschrieben, sondern nur in seiner Library Loki implementiert.
Wer sich das ganze mal ansehen will: Loki

mfg Philipp

Werbeanzeige