title image


Smiley Re: Konzeptfrage - Kommunikation über verschiedene Schnittstellen
Hi, Dummy!

Du solltest dir mal überlegen, wie die Klassen verwendet werden sollen, und erst dann die Hierarchie bauen. Nimm' z.B. die CInterface Klassen:



typedef std::auto_ptr<CInterface> iface_ptr;

iface_ptr interface (new CRS232);

interface->open (...); // ???

...

interface->close (); // ???



Also müssen open bzw. close virtuell sein. Wenn das nicht geht (weil z.B. die Parametertypen unterschiedlich sind), kannst du die Parameter z.B. mit dem Konstruktor übergeben:



iface_ptr interface (new CRS232 ("/dev/tty0"));



Entweder öffnet der Konstruktor die Schnittstelle gleich über einen entspr. Aufruf, oder der Parameter wird als Membervariable gespeichert und die Schnittstelle erst später (z.B. über einen Proxy) geöffnet. In ersterem Fall kann der c'tor eine Ausnahme werfen, wenn die Schnittstelle nicht geöffnet werden konnte.

Außerdem sollte der Destruktor nach Möglichkeit die Schnittstelle wieder schließen, damit niemand darauf vergißt.



Die Kommunikationsklassenhierarchie würde ich anders aufbauen. Besser wäre eine Lösung, die Geräte und Modi getrennt behandelt.



class ComDevice

{

public:

virtual int send_cmdx (CInterface &i) = 0;

virtual int recieve_cmdx (CInterface &i) = 0;

virtual ~ComDevice ();

};



class Device1 : public ComDevice

{

public:

Device1 (Mode const &m) : m_ (m.clone ()) {}

virtual int send_cmdx (CInterface &i)

{ return m->send_cmdx (i, *this); } // --> die Definition nach .cpp Verschieben!

// detto recieve_cmdx

private:

std::auto_ptr<Mode> m_;

};



class Mode

{

public:

virtual Mode* clone () const = 0;

virtual ~Mode ();

virtual int send_cmdx (CInterface &i, Device1 &d) { return -1; }

virtual int send_cmdx (CInterface &i, Device2 &d) { return -1; }

....

virtual int recieve_cmdx (CInterface &i, Device1 &d) { return -1; }

virtual int recieve_cmdx (CInterface &i, Device2 &d) { return -1; }

};



class ModeA : public Mode

{

public:

virtual Mode* clone () const { return new ModeA (*this); }

virtual int send_cmdx (CInterface &i, Device1 &d);

....usw.

};



Man könnte auch auf das Visitormuster verzichten und alle send_xxx/recieve_xxx Funktionen in den Deviceklassen definieren. Hängt auch davon ab, welche Klassenhierarchie wie oft geändert/erweitert wird.

cheers,

BF



geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: