Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » 2 Bibliotheken: Basisklasse?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
27.12.2009, 17:05 Uhr
~Mati99
Gast


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:


C++:
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?


C++:
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);

}



Ich habe 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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.12.2009, 19:12 Uhr
0xdeadbeef
Gott
(Operator)


So etwa könnte man das machen, ja.

Allerdings sollte die Basisklasse einen virtuellen Destruktor haben, sonst hast du wenigstens theoretisch undefiniertes Verhalten.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.12.2009, 15:32 Uhr
~Mati99
Gast


VIelen Dank.
Das mit den dummy-Argumenten - ist das wirklich so üblich?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.12.2009, 17:11 Uhr
0xdeadbeef
Gott
(Operator)


Naja, du willst ein einheitliches Interface, und da du zur Compilezeit nicht weißt, welches Backend benutzt werden wird, musst du ihm alles durchreichen, was das Backend brauchen könnte. Ich seh so spontan keine andere Möglichkeit.

Dieses spezielle Problem ist mir so noch nicht untergekommen, aber für Plugin-Architekturen ist es durchaus üblich, ebenso für die Auswahl verschiedener Backend-Klassen zur Laufzeit (das kommt eigentlich schon relativ nah an dein Problem ran), und ich habe es auch schon gelegentlich bei Signal-Handlern in alten Bibliotheken gesehen (etwa MFC). Aus Kosmetikgründen würde man MyClassLib2::foo wohl eher als

C++:
         void foo (int a, double) // unbenutztes Argument ohne Namen
        {
                 use_lib2_foo(a);
        }


schreiben, damit der Compiler nicht wegen des unbenutzten Parameters warnt, aber die Technik selbst ist eigentlich recht normal.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: