Wie greife ich auf einen geerbten Typedef Typ zu?



  • Hallo zusammen,

    kennt jemand von euch eine Möglichkeit folgendes zu tun?

    // Irgendwelche "Policy" Klassen 
    class Intern
    {
    
    };
    
    class Extern
    {
    
    };
    
    ////////
    
    // Thread der die Policy bekommt
    template <typename WatchdogType>
    class C_Thread
    {
    public:
    	typedef WatchdogType WatchDog_t;
    
    };
    ///////
    
    // Irgendwas dass von Thread ableitet
    template <typename T>
    class C_App : public C_Thread<T>
    {
    public:
    
    };
    ///////
    
    // Eine Klasse die den von Thread abgeleiteten Typ benuzt
    class T
    {
    public:
    	C_App<Intern> app;
    
    	T()
    	{
               // Hier möchte ich auf WatchDog_t zugreifen (so funktioniert es leider nicht)
    		cout << typeid(app.WatchDog_t).name();
    	}
    };
    /////
    
    int main( void ) 
    {
    
    	T t;
    	return 0;
    }
    

    Die Fehlermeldung vom Compiler

    make all 
    Building file: ../src/testIt.cpp
    Invoking: Cygwin C++ Compiler
    g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/testIt.d" -MT"src/testIt.d" -o"src/testIt.o" "../src/testIt.cpp"
    ../src/testIt.cpp: In constructor `T::T()':
    ../src/testIt.cpp:53: error: invalid use of `C_Thread<Intern>::WatchDog_t'
    make: *** [src/testIt.o] Error 1
    

    Danke für die Hilfe...

    Grüße
    Tobi



  • Ein typedef ist keine Membervariable eines Objektes, deshalb geht der Zugriff über app und operator. nicht

    cout << typeid(C_App<T>::WatchDog_t).name();
    

    Ich bin nicht ganz sicher, ob
    a) noch ein typename vor das C_App muss
    b) WathcDog_t in C_App von C_Thread geerbt wird.



  • Hallo pumuckl,

    danke für die Antwort.

    Das C_App<Intern>::Watchdog_t funktioniert. Aber ich suche nach einer Möglichkeit über die Membervariable an den Typedef zu kommen (wenn es irgendwie geht)....

    Gruß
    Tobi



  • Tobias Gerg schrieb:

    Das C_App<Intern>::Watchdog_t funktioniert. Aber ich suche nach einer Möglichkeit über die Membervariable an den Typedef zu kommen (wenn es irgendwie geht)....

    Das geht nicht. Aber das ist auch nicht erforderlich. Wenn Du den Member kennst, kennst Du auch den Typ des Members. In welcher Situation meinst Du denn, das zu brauchen, dann kann man Dir evtl. eine Alternative vorschlagen?



  • Hallo LordJaxom,

    danke für die Antwort.

    Mittlerweile ist mir auch klar geworden, dass es mit normalen mitteln nicht funktionieren kann (also operator. bei einer Member) und bin von dem Gedanken der mich getragen hat wieder weg gekommen.

    Es ging darum, dass ich nach einer Möglichkeit gesucht habe um in einem Framework (dass schon sehr lange existiert 😉 ) möglicherweise Schreibarbeit zu sparen.

    Es ist leider momentan so, dass soetwas vorkommen kann...

    int C
    {
        App<Intern> a;
        Bla <Intern>
        Bla2<Intern>
        // usw usf.
    }
    

    Dass Intern kann sich aber jederzeit wieder ändern. Und da kam mir eine sehr sehr sehr dumme Idee derer ich mich mittlerweile wieder entledigt habe.

    int C
    {
        App<Intern> a;
        Bla <a.type>
        Bla2<a.type>
        // usw usf.
    }
    

    Naja, in Zeiten von Refactoring sollte man solche Gedankenquergänge eigentlich nicht mehr haben (*schäm* 😞 )

    Trotzdem wäre mir mittlerweile auch ein Hack über typeof eingefallen. 🙄

    class Hack
    {
      public:
      C_App<usedType::Watchdog_t> usedVar;
      Bla<usedType::Watchdog_t> a;
      // usw...
    
      private:
      static C_App<Intern> notUsed;
      typedef typeof(notUsed) usedType;  
    }
    

    Aber wie gesagt, ist eigentlich (nicht nur eigentlich... 😃 ) völliger Blödsinn...

    Gruß
    Tobi



  • zuerst einmal ist typeof kein standard-C++ sondern eine Erweiterung deines Compilers - dmait ist dein Code nicht portabel.

    Was dein Intern-ändert-sich-Problem angeht:
    aus

    int C
    {
        App<Intern> a;
        Bla <Intern>
        Bla2<Intern>
        // usw usf.
    }
    

    mach einfach

    int C
    {
        typedef Intern param_t;
        App<param_t> a;
        Bla <param_t>
        Bla2<param_t>
        // usw usf.
    }
    

    jetzt kannst du Intern an einer Stelle ändern (im typedef) - und voilá, alles paletti.



  • pumuckl schrieb:

    zuerst einmal ist typeof kein standard-C++ sondern eine Erweiterung deines Compilers - dmait ist dein Code nicht portabel.

    Was dein Intern-ändert-sich-Problem angeht:
    aus

    int C
    {
        App<Intern> a;
        Bla <Intern>
        Bla2<Intern>
        // usw usf.
    }
    

    mach einfach

    int C
    {
        typedef Intern param_t;
        App<param_t> a;
        Bla <param_t>
        Bla2<param_t>
        // usw usf.
    }
    

    jetzt kannst du Intern an einer Stelle ändern (im typedef) - und voilá, alles paletti.

    Supi... 👍 Genau so stell ich mir dass vor. (Das man auf das Einfachste nicht selbst kommt... *handandenkopfklatsch* )

    Danke
    Tobi


Anmelden zum Antworten