Toon posts:

[C++]Nieuwe class types registreren bij een manager @runtime

Pagina: 1
Acties:

Verwijderd

Topicstarter
Stel dat je een stream manager hebt en een basisklasse voor een streamable object("Stream"). De manager creëert bijvoorbeeld filestreams en netwerk streams en geeft dan aan de gebruiker een stream pointer door waar deze mee kan werken. De gebruiker krijgt dus steeds een stream pointer en dus nooit iets als een file stream pointer om mee te werken.

Het probleem is als volgt:
De stream manager kent wel al bepaalde stream types (file, udp in, udp out, tcp in, tcp out, etc), maar ik zou graag ervoor zorgen dat er at runtime nog types kunnen worden geregistreerd. Zoiets als:
StreamManager::RegisterStreamType("http", HttpStream)
Waarbij http de benaming is (je vraagt dus een stream van dit type op dmv "http://adres" te openen via de stream manager) en HttpStream de klasse is waaruit objecten van dit type moeten worden gecreëerd. HttpStream moet natuurlijk afgeleid zijn van Stream, net als FileStream en de andere afgeleide klassen (die reeds intern zouden worden aangemeld via RegisterStream).

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Je kan het beste eens kijken naar het (abstract) factory design pattern.

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

het concept is me bekend van in Java, maar dit is een mooie toepassing... bookmarked...

je gaat dus als ik het goed begrijp je factory registreren (met gelijke interface) die dan instances van het type stream kan maken... en natuurlijk virtual niet vergeten... mooi

ASSUME makes an ASS out of U and ME


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 05-05 18:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op zondag 05 juni 2005 @ 20:40:
StreamManager::RegisterStreamType("http", HttpStream)
Waarbij http de benaming is (je vraagt dus een stream van dit type op dmv "http://adres" te openen via de stream manager) en HttpStream de klasse is waaruit objecten van dit type moeten worden gecreëerd. HttpStream moet natuurlijk afgeleid zijn van Stream, net als FileStream en de andere afgeleide klassen (die reeds intern zouden worden aangemeld via RegisterStream).
Beetje vaag, je registreert toch niet een enkele stream voor een heel protocol? De stream heb je pas zodra je verbinding is opgezet, je kunt dus geen "http stream" koppelen aan een protocol. Je zult een interface moeten ontwerpen die streams kan maken, een factory dus.

C++:
1
2
3
4
5
6
7
class StreamFactory
{
public:
    virtual ~StreamFactory() { }

    virtual Stream * CreateStream (const std::string & address) = 0;
};


En die implementeer je voor http streams, instantieer je en registreer je bij de stream manager

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
@ .oisyn "http" was eigenlijk een verkeerd voorbeeld, maar 't is wel de bedoeling om stream types te kunnen registreren zoals file stream, netwerk stream, etc.

Ik ga het factory pattern eens nader bestuderen :)

Eerst was ik zeg maar tevreden dat de stream manager gewoon met de standaard streams overweg kan die ik zelf programmeer in m'n library (dus file en netwerk streams), maar achteraf leek het me handig om ook proprietary streams te registreren. Het doel van de stream manager is ook om bijvoorbeeld streams te kunnen koppelen aan elkaar en de gebruiker de mogelijkheid geven om bijvoorbeeld alle filestreams even te routen naar een netwerk stream, zodat content kan worden opgehaald via een server in plaats van lokaal op de pc. Of om bijvoorbeeld remote logging te doen om makkelijk een server applicatie te kunnen debuggen.

[ Voor 67% gewijzigd door Verwijderd op 06-06-2005 10:48 ]