Dynamisches Erzeugen unterschiedlicher Klassen

Gast #250789
Hi Leuts,

folgende Frage:
Ich habe zwei Klassen 8DBL425 und DBL800). Sie unterschieden sich
lediglich im Aufbau einiger Mehtoden, haben aber nach aussen hin die
gleichen Methoden mit gleichen Parametern und gleichen Rückgabewerten.
Nun möchte ich zur Laufzeit eine Variable erzeugen, entweder von der
einen Klasse doer von der anderen. Das entscheidet sich erst zur
Laufzeit! Dazu möchte ich aber ein und denselben Pointer benutzen. Aber
wie rufe ich dann die Methoden auf, da ich ja erst zur Laufzeit weiss
von welchem Typ der Pointer ist ?

Hintergrund ist folgender:
Über die serielle Schnittstelle kommuniziere ich mit einem Messgerät.
Dieses Protokoll wurde aber einmal geändert, weshalb ich hier zwei
unterschiedliche Protokolle einhalten muss, entweder das eine oder das
andere.
Wie mache ich sowas am besten ?

Greets
Karlheinz
Persönliche Seite #250790
Beide Klassen verwenden die gleiche Basisklasse, alle relevanten von Dir
aufzurufenden Methoden sind virtuelle Methoden,

Also;
1
basisklasse
2
{
3
  virtual int machwas() = 0;
4
};
5

6
klasse1 : public basisklasse
7
{
8
  virtual int machwas() { return 1;};
9
};
10

11
klasse2 : public basisklasse
12
{
13
  virtual int machwas() { return 2;};
14
};
15

16

17
basisklasse* p;
18
int x;
19

20
p = (basisklasse *) new klasse1;
21

22
x = p->machwas();
23

24
// x ist 1
25

26
p = (basisklasse *) new klasse2;
27

28
x = p->machwas();
29

30
// x ist 2

Statt des C-Typecasts "(basisklasse *)" sollte ein geeigneteres
C++-Konstrukt verwendet werden, reinterpret_cast oder dergleichen.
Gast #250791
class Kommunikator
{
   public:
   Kommunikator(int param1, int param2)
   {
      ... // Hier könnte man das tun, was beide Klassen
          // gemeinsam haben
   }

   virtual ~Kommunikator()
   {
      ...
   }

   virtual void tueDies(void)=0;
   virtual void tueDas(void)=0;
}

class Protokoll1Kommunikator : public Kommunikator
{
   public:
   Protokoll1Kommunikator(int param1, int param2, int param3)
                 :Kommunikator (param1, param2)
   {
      // Mit param1 und 2 wird der Konstruktor von
      // Kommunikator aufgerufen
      ... // Konstruktor von Protokoll 1
   }

   ~Protokoll1Kommunikator()
   {
      ...
   }

   void tueDies(void)
   {
      ... // Wie Protokoll 1 dies tut.
   }
   void tueDas(void)
   {
      ... // Wie Protokoll 1 das tut.
   }
   private:
   void ganzgeheim()
   {
      ... // Etwas ganz Geheimes das nur Protokoll 1 macht
   }
}

class Protokoll2Kommunikator : public Kommunikator
{
   public:
   // Konstruktor wie oben


   void tueDies(void)
   {
      ... // Wie Protokoll 2 dies tut.
   }
   void tueDas(void)
   {
      ... // Wie Protokoll 2 das tut.
   }

   ~Protokoll2Kommunikator()
   {
      ...
   }
}

void main()
{
   int protokoll;
   ...
   Kommunikator* k;
   if(protokol==1) k = new Protokoll1Kommunikator(a,b,c);
   else if(protokol==2) k = new Protokoll2Kommunikator(...);
   ...
   k->tueDies();
   k->tueDas();
   ...

}
Gast #250795
Also da gibt es ganz kluge Leute, die haben vor nicht langer Zeit
Designpatterns aufgeschrieben, wenn sich bei mir jemand um eine Stelle
als Programmierer bewirbt kommt die Frage nach Kenntnis von
Designpatterns:

Ich empfehle:

"Entwurfsmuster" von Gamma/Helm/Johnson/Vlissides

Adison-Weseley ISBN 3-8273-1862-9

Orginal ist auf Englisch, ist auch besser.

Dort findet man Fabrik und abstrakte Fabrik

Warum das Rad neu erfinden...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.