Instanzenweiche c++



  • Dann definiere ein Interface.
    Simon



  • Wenn die beiden Datentypen ObjektA und ObjektB nichts miteinander zu tun haben (also nicht von einer gemeinsamen Basisklasse ableiten, dann geht das so, wie du es dir vorstellst, nicht. C++ ist typisiert. Man kann nicht einfach sagen: "Wenn Bedingung 1 erfüllt ist, soll x ein String sein, ansonsten soll x ein DataReader sein." Es sei denn, du arbeitest mit void*, aber dann musst du jedes mal konvertieren.



  • bei dem ersten Teil der Antwort habe ich zwei Variablen, aber ich kann nur etwas mit einer anfangen. Ich möchte das Programm mit dieser Variablen weiterschreiben z. B. sa.lesen().
    Bei dem zweiten Teil tritt das Problem auf, dass ich auf Methoden und Membervariablen, die zwar in ObjektA, aber nicht im BasisObjekt oder ObjektB deklariert sind, nicht zugreifen kann.



  • Conny2 schrieb:

    Bei dem zweiten Teil tritt das Problem auf, dass ich auf Methoden und Membervariablen, die zwar in ObjektA, aber nicht im BasisObjekt oder ObjektB deklariert sind, nicht zugreifen kann.

    Das kannst du doch sowieso nicht, ohne den Typ abzufragen, denn du weißt ja nicht, welches Objekt erstellt wurde.

    Erklär doch mal genauer, in welchem Zusammenhang ObjektA und ObjektB stehen, und was du danach damit machen willst.



  • Scheint wohl eine Aufgabe zu sein, denn es erinnert mich stark an http://www.c-plusplus.net/forum/viewtopic-var-t-is-255526.html (von gestern abend).



  • Conny2 schrieb:

    bei dem ersten Teil der Antwort habe ich zwei Variablen, aber ich kann nur etwas mit einer anfangen. Ich möchte das Programm mit dieser Variablen weiterschreiben z. B. sa.lesen().
    Bei dem zweiten Teil tritt das Problem auf, dass ich auf Methoden und Membervariablen, die zwar in ObjektA, aber nicht im BasisObjekt oder ObjektB deklariert sind, nicht zugreifen kann.

    Ja, das kannst du nicht, weil deine zwei Klassen nicht die selbe Schnittstelle (Interface) haben. Haben diese beiden Klassen fachlich etwas gemeinsam? Z.B. müssen sie ja beide die Member-Funktion lesen() haben, richtig? Daraus folgt, sie müssen beide ein gemeinsames Interface haben. Das kannst du mit reinen virtuellen Funktionen erfüllen:

    http://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_OOP/_Abstrakte_Klassen

    Hast du kein vernünftiges C++-Einsteigerbuch? Schlag da mal nach "Klassen Vererbung" nach. Ansonst kann ich mich nur MFK anschlißen: was sind denn konkret ObjektA und ObjektB? Dann können wir dir genauer weiter helfen.



  • Ich habe zwei Maschinen (ObjektA,ObjektB), von denen ich Daten einlese. Die Formate und Einleseroutinen sind sehr verschieden. Es gibt aber auch ein BasisObjekt für gleiche Aufgaben.
    Die Daten werden einem Fit zur Auswertung übergeben.



  • Conny2 schrieb:

    Ich habe zwei Maschinen (ObjektA,ObjektB), von denen ich Daten einlese. Die Formate und Einleseroutinen sind sehr verschieden. Es gibt aber auch ein BasisObjekt für gleiche Aufgaben.
    Die Daten werden einem Fit zur Auswertung übergeben.

    OK, also sind beides Maschinen. Eine Gemeinsamkeit! Und beide lesen Daten ein. Wieder eine Gemeinsamkeit. Aber die lesen-Funktion ist für jeden Maschinen-Typ anders. Das kannst du doch formulieren:

    class Maschine
    {
      public:
           virtual string lesen() = 0; // = 0 bedeutet "keine Implementierung bekannt"!
    };
    

    So, deine beiden Maschinen-Typen erben von Maschine. Und dort mußt du die spezialisierte lesen-Funktion implementieren:

    class MaschinenTypA : public Maschine
    {
      public:
           string lesen()
           {
                  // hier die spezielle Funktion für Maschinen Typ A
           }
    };
    
    class MaschinenTypB : public Maschine
    {
      public:
           string lesen()
           {
                  // hier die spezielle Funktion für Maschinen Typ B
           }
    };
    


  • Maschine* m = 0;
    
    if (flag)
    {
       m = new MaschineTypA();
    }
    else
    {
       m = new MaschineTypB();
    }
    
    m->lesen();  // wird autom. die richtige lesen()-Funktion aufgerufen.
    


  • vielen Dank Euch allen für Eure Mühe. Ich werde den letzten Vorschlag ausprobieren.
    Viele Grüße
    Conny


Anmelden zum Antworten