Probleme mit Basisklasse und Member von Abgeleiteten Klassen



  • Hallo,

    ich habe ein Problem in meinem Design. Ich möche auf die member eines Template-basiertes Member-Objekts einer abgeleiteten Klasse in der main zugreifen doch das geht so nicht.

    Als Erklärung hilft vielleicht folgender Pseudocode:

    class Mtx
    {
           public:
                Mtx() {mtx_i = 9;}
                int mtx_i;
                double mtx_d;
    };
    class Base
    {
         public:
              virtual ~Base() {};
    };
    class Derived1 : public Base
    {
         public:
              Derived1() { mtx = NULL;}
              Mtx<double> * mtx;
    };
    class Derived2 : public Base
    {
         public:
              Derived2() { mtx = NULL;}
              Mtx<int> * mtx;
    };
    
    int main(void)
    {
         Base *base = NULL;
         int var = 0; // var wird unterschiedlich gesetzt: LaufzeitPolymorphie     
    
         if (var == 0) base = new Derived1();
         else base = new Derived2();
    
         // Jetzt möchte ich auf mtx_a oder mtx_i vom Pointer auf Mtx zugreifen
         // Nur weiß ich nicht genau wie. Ich möchte nicht für jeden einzelnen
        // Member von Mtx eine access-funktion innerhalb der Klasse base machen
       // das wäre doch wahnsinn. Geht das nicht irgendwie?
       std::cout << base->mtx_i << std::endl;
    
         return 0;
    }
    

    Danke euch!


  • Mod

    Kannst du deinen "Pseudocode" nochmal überarbeiten? Wo kommt denn da überhaupt ein Template ins Spiel?



  • template <class T>
    class Mtx
    {
           public:
                Mtx<T>() {mtx_i = 9;}
                int mtx_i;
                double mtx_d;
    };
    class Base
    {
         public:
              virtual ~Base() {};
    };
    class Derived1 : public Base
    {
         public:
              Derived1() { mtx = NULL;}
              Mtx<double> * mtx;
    };
    class Derived2 : public Base
    {
         public:
              Derived2() { mtx = NULL;}
              Mtx<int> * mtx;
    };
    
    int main(void)
    {
         Base *base = NULL;
         int var = 0; // var wird unterschiedlich gesetzt: LaufzeitPolymorphie    
    
         if (var == 0) base = new Derived1();
         else base = new Derived2();
    
         // Jetzt möchte ich auf mtx_a oder mtx_i vom Pointer auf Mtx zugreifen
         // Nur weiß ich nicht genau wie. Ich möchte nicht für jeden einzelnen
        // Member von Mtx eine access-funktion innerhalb der Klasse base machen
       // das wäre doch wahnsinn. Geht das nicht irgendwie?
       std::cout << base->mtx_i << std::endl;
    
         return 0;
    }
    


  • Ich glaub du hast templates noch nicht so ganz verstanden...
    Mtx ist zwar als template-Klasse deklariert, nur wird nirgendwo der template-Parameter verwendet!
    Stattdessen hältst du für alle template-Varianten nur einen int und einen double-Member!
    Und Derived1::mtx ist eine anderer Typ als Derived2::mtx! Und da Base noch kein mtx-Member hat hast du ein Problem!
    Eine Lösung? Kommt auf das konkrete Problem an.
    Du kannst dir z.B. eine template-Funktion schreiben, die dir den Zugriff auf das mtx erledigt.
    Oder eine normale Funktion, der du auch das "var" mitgibst, und die dann ensprechend einen cast durchführt, um auf das mtx zugreifen zu können.
    Oder du castest jedesmal selber wenn du zugreifen willst. Oder ...
    Sag einfach, was du konkret alles machen musst. Denn diese Mischung aus Runtime- und COmpiletime-Polymorphie ist nicht sooo leicht.


Anmelden zum Antworten