Forum: PC-Programmierung C++ Kommunikationsklassen Umsetzung?


von Werner (Gast)


Lesenswert?

Hallo zusammen,

ich möchte mir zur Kommunikation über eine serielle Schnittstelle ein 
Kommunikationsobjekt bauen:
1
class ComBase {
2
protected:
3
  void send(void *data);
4
  void receive(void *data);
5
};
6
7
class ComMaster: public ComBase  {
8
  void sendRequest(void) {
9
    //Requestframe bauen
10
    //...
11
    send(&frame);
12
  }
13
};
14
15
class ComSlave: public ComBase {
16
  void sendReply(void) {
17
    //Replyframe bauen
18
    //...
19
    send(&frame);
20
  }
21
};
22
23
//Auf Masterseite
24
ComMaster com;
25
//Auf Slaveseite
26
ComSlave com;

Soweit so gut, nun möchte ich aber optional an die Schnittstelle ein 
Funkmodul anschließen und dazu eine ComRadio Klasse schreiben, die die 
Methoden send und receive überschreibt, und darin die Daten für das 
Funkmodul einpacket.
1
class ComRadio: public ComBase {
2
  void send(void *data); //überschreibt ComBase
3
  void receive(void *data); //überschreibt ComBase
4
};

Wie kann ich nun einen RadioSlave bzw. einen RadioMaster instanziieren?
Ich müsste fallweise die Klasse ComRadio zwischen ComBase und ComSlave 
bzw. ComMaster schieben. Wie könnte man das umsetzen?

Werner

: Verschoben durch User
von René H. (Gast)


Lesenswert?

Werner schrieb:
> Ich müsste fallweise die Klasse ComRadio zwischen ComBase und ComSlave
> bzw. ComMaster schieben. Wie könnte man das umsetzen?

Ich habe das Problem vermutlich nicht verstanden. Was spricht gegen 
einer Subklasse von ComMaster resp. ComSlave?

Grüsse,
René

von Rolf M. (rmagnus)


Lesenswert?

Meines Erachtens ist die Klassenhierarchie nicht die richtige.
ComMaster und ComSlave sollten nicht von ComBase ableiten. Es sind zwei 
verschiedene Dinge. ComBase (bzw. davon abgeleitete Klassen) 
repräsentiert die Schnittstelle, während ComMaster und ComSlave ein 
darüberliegendes Protokoll abbilden.

von Wilhelm M. (wimalopaan)


Lesenswert?

Werner schrieb:
> Hallo zusammen,
>
> ich möchte mir zur Kommunikation über eine serielle Schnittstelle ein
> Kommunikationsobjekt bauen:
>
>
1
> class ComBase {
2
> protected:
3
>   void send(void *data);
4
>   void receive(void *data);
5
> };
6
>
>

Ich denke auch, das ComMAster bzw. ComSlave jeweils die entsprechende 
Seite eines Protokolls realisieren. Die sollten dann jeweils ein 
Exemplar von ComBase bzw. eines davon abgeleiteten Typs verwenden.

Falls ComBase eine Schnittstelle sein sollte oder generell als 
Basisklasse dienen soll, so müssen die Elementfunktionen, die 
überschrieben werden sollen, als virtual deklariert und bei einem 
Interface als rein-virtuell (=0) und public, und der dtor muss virtual 
sein.

Zusätzlich würde ich bei send einen Input-Buffer (alos const data*) 
verwenden bzw. gänzlich auf rohe Arrays zugunsten von std::vector / 
std::array verzichten (sofern verfügbar, ggf. eigene Realisierungen wie 
etwa ein FixedVector (ohne Heap-Alloc).


Vielleicht kann der TO mehr Infos liefern?

: Bearbeitet durch User
von Thomas W. (diddl)


Lesenswert?

Entweder als virtuelle Funktionen, - oder als Template.


Wenn du für das Template Konzept ein gut durchdachtes Design verwendest, 
dann kannst du das Funmodul auf unterschiedliche Arten verbinden, zb. 
auch über I2C oder SPI.


Bei schmaler Hardware, wie zb. Atmegas würde ich das Template Konzept 
bevorzugen. Bei den großen ist es vermutlich einfacher mit virtuellen 
Funktionen

von dulnik (Gast)


Lesenswert?

Rolf M. schrieb:
> Meines Erachtens ist die Klassenhierarchie nicht die richtige.
> ComMaster und ComSlave sollten nicht von ComBase ableiten. Es sind zwei
> verschiedene Dinge. ComBase (bzw. davon abgeleitete Klassen)
> repräsentiert die Schnittstelle, während ComMaster und ComSlave ein
> darüberliegendes Protokoll abbilden.

Genau so ist es. Das gleiche gilt für ComRadio.

ComRadio ist ein Protokoll und BENUTZT die serielle Schnittstelle. Oder 
besser gesagt kann die serielle Schnittstelle benutzen neben vielen 
anderen IST aber keine.

von dulnik (Gast)


Lesenswert?

dulnik schrieb:
> Rolf M. schrieb:
>> Meines Erachtens ist die Klassenhierarchie nicht die richtige.
>> ComMaster und ComSlave sollten nicht von ComBase ableiten. Es sind zwei
>> verschiedene Dinge. ComBase (bzw. davon abgeleitete Klassen)
>> repräsentiert die Schnittstelle, während ComMaster und ComSlave ein
>> darüberliegendes Protokoll abbilden.
>
> Genau so ist es. Das gleiche gilt für ComRadio.
>
> ComRadio ist ein Protokoll und BENUTZT die serielle Schnittstelle. Oder
> besser gesagt kann die serielle Schnittstelle benutzen neben vielen
> anderen IST aber keine.

Gabe den Punt vor "IST" vesgessen... :-)

von Nop (Gast)


Lesenswert?

Einer der Vorteile von OOP ist halt, daß man sich den Kopf über 
Scheinprobleme wie is-a vs. has-a zerbrechen kann, wenn einem die 
eigentliche Problemstellung zu langweilig ist. ;-)

von Werner (Gast)


Lesenswert?

>ComRadio ist ein Protokoll

wobei aber ComRadio auf das "ursprüngliche" Protokoll aus ComSlave und 
ComMaster aufsetzen soll, aber um solche Frames zu übertragen muss bei 
den Funkmodulen eben noch eine Schicht außen rum :-(

Vielleicht dann vielleicht so:

ComBase
|
+-ComMaster //Protokoll
|
+-ComSlave //Protokoll

ComHal
|
+-ComRS232
|
+-ComRadio

Das ComBase HAT dann einen Nachkommen von ComHal. Aber wenn ComHal etwas 
empfängt, wie bekommt das der ComMaster oder -Slave mit?

Werner

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.