2 Bibliotheken: Virtuelle Basisklasse oder wie?



  • Hallo,

    ich möchte für meine mathematischen funktionen 2 unterschiedliche Bibliotheken benutzen. Also im code einfach je nach input flag 2 verschiedene lib-funktionen aufrufen lassen.
    Ich frage mich nach einer sinnvollen vorgehensweise. Wäre hier Laufzeitpolymorphie sinnvoll? Was gäbe es denn noch für Möglichkeiten?

    Kurzes Pseudo-code beispiel:

    class MyClass
    {
       public: 
    
            void foo(int lib) 
            {
                if (lib == 0)
                     use_lib1_foo();
                else
                     use_lib2_foo();
            }
    };
    
    int main(void)
    {
    
         MyClass myclass;
         myclass.foo(1);
    
    }
    

    Es ist nämlich so das die libs unterschiedliche signaturen haben.
    Wenn ich jetzt eine abstrakte basisklasse habe muss ich doch eine vereinigungsmenge aller argumente beider calls in den methodenrumpf übergeben oder? Also sozusagen dummy-argumente.
    Wie geht man da vor?

    Beispiel:

    class MyClassBase 
    {
          public:
              virtual void foo(int a, double b) = 0;
    };
    
    class MyClassLib1 : public MyClassBase
    {
       public: 
    
             void foo (int a, doulbe b)
            {
                     use_lib1_foo(a,b);
            }
    };
    class MyClassLib2 : public MyClassBase
    {
       public: 
    
             void foo (int a, double b) // hier ist b dummy argument?????
            {
                     use_lib2_foo(a);
            }
    };
    int main(void)
    {
          int lib = -1;
         //lib wird vorher gesetzt
    
         MyClassBase* myclassBase = NULL;
         if (lib == 0) myclassBase = new MyClassLib1;
         else myclassBase = new MyClassLib2;
         myclassbase.foo(2,3.0);
    
    }
    

    danke



  • Zuerst einmal: Virtuelle Basisklasse != abstrakte Basisklasse.

    Weisst du bereits zur Kompilierzeit, welche Version du aufrufen willst, oder ist das erst zur Laufzeit bekannt? Wenn die beiden Funktionen unterschiedliche Signaturen haben, kannst du diese nicht einheitlich ansprechen. Ich fände eine If-Abfrage naheliegender als Polymorphie (man muss für einzelne Funktionen nicht gleich Klassen bauen), aber du müsstest dir überlegen, wie du das mit unterschiedlichen Parametern handhabst.

    Kannst du vielleicht etwas näher erläutern, wieso du zwei unterschiedliche Funktionen gleich behandeln willst (oder was für Funktionen das sind)?



  • Nexus schrieb:

    Ich fände eine If-Abfrage naheliegender als Polymorphie (man muss für einzelne Funktionen nicht gleich Klassen bauen)

    Warum nicht? Das Strategiemuster würde sich doch hier anbieten.



  • Weisst du bereits zur Kompilierzeit, welche Version du aufrufen willst, oder ist das erst zur Laufzeit bekannt?

    Ich weiß defnitiv erst zur Laufzeit bescheid da der user über ein input-flag (Konsolenparameter) zwischen den beiden Libs schalten wird/darf/soll.

    Kannst du vielleicht etwas näher erläutern, wieso du zwei unterschiedliche Funktionen gleich behandeln willst

    Weil ich 2 unterschiedlich performante Bibliotheken habe. Ich will in meinem Algorithmus die Auswirkung beider Bibliotheken (Laufzeitperformanz) darstellen.
    Es wird dasselbe getan, nur bekommt die eine Bibliothek etwas andere Datenstrukturen und etwas mehr input.

    Die Libs sind numerische Bibliotheken die Funktionen beinhalten die sehr performant z.B. Matrix-Vektor Produkte oder gewisse mathematische Zerlegungen berechnen.

    Wie würde das denn mit dem Strategie-Pattern aussehen?



  • Mati schrieb:

    Es wird dasselbe getan, nur bekommt die eine Bibliothek etwas andere Datenstrukturen und etwas mehr input.

    Sind diese bibliotheksspezifischen Strukturen über mehrere Funktionsaufrufe konstant? Dann könnte man sie doch im Konstruktor übergeben. Also eine Schnittstellenklasse mit rein virtuellen Methoden, zwei Wrapper für die beiden Libs die diese Schnittstellenklasse implementieren und spezifische Argumente vorher im ctor bekommen.



  • Sind diese bibliotheksspezifischen Strukturen über mehrere Funktionsaufrufe konstant? Dann könnte man sie doch im Konstruktor übergeben. Also eine Schnittstellenklasse mit rein virtuellen Methoden, zwei Wrapper für die beiden Libs die diese Schnittstellenklasse implementieren und spezifische Argumente vorher im ctor bekommen.

    Ich weiß nicht genau was du meinst...falls du meinst ob sich die signatur der einzelnen funktionen EINER Lib unterscheidet dann ja. Die Datenstrukturen sind aber natürlich für die LIB spezifisch konstant.
    Kurzes Beispiel? wäre sehr hilfreich danke 🙂



  • 😞
    ich bräcuhte leider immer noch einen rat....


Anmelden zum Antworten