pro- und epilog code fuer virtuelle funktion



  • hola leute

    bastel grad an einer klasse fuer IPC und hab da zum versenden eine (rein) virtuelle funktion definiert. nun moechte ich, wenn ich von der klasse abgeleitet habe, beim aufruf der virtuellen funktion, vorher und nachher code ausfuehren lassen. gibt es dafuer eine moeglichkeit, das das automatisch passiert ? oder muss ich den code jeweils am anfang und am ende der virtuellen funktion einbauen bzw. aufrufen ?

    Meep Meep



  • Ein Sentry, z.B. Stroustrup C++PL $21.3.8 könnte helfen.

    Das ist eine Klasse die eigentlich nur einen Konstruktor und einen Destruktor braucht; denn nur in den Funktionen wird etwas geleistet.

    Ein formaler Parameter dieses Typs in der Argumentliste der rein virtuellen Funktion müsste den gewünschten Effekt erreichen; er wird vor Funktionseintritt konstruiert(ctor-Aufruf) und beim Verlassen des Funktionskörpers destruiert(dtor-Aufruf).
    Zugleich würde der dtor bei Exceptions aufräumen können.

    Grüsse

    *this



  • Hallo

    Wenn es nur genau ein Code-Block wäre der für jede Ableitung mit ausgeführt werden soll wäre es einfach

    class A
    {
      virtual void Foo() = 0
      {
        // Hier gemeinsamer Code
      }
    };
    
    class B : public A
    {
      virtual void Foo()
      {
        // Spezieller Code
        A::Foo(); // Ruft gemeinsamen Code auf
        // Spezieller Code
      }
    };
    

    Das geht natürlich nur für genau einen Code-Block, und es liegt in der Verantwortung von B diesen Code überhaupt aufzurufen.

    Eine andere Möglichkeit wäre eine Zwischenfunktion

    class A
    {
      public :
    
      // Hauptfunktion
      void Foo()
      {
        // gemeinsamer Code
        DoFoo();
        // gemeinsamer Code
      }
    
      protected :
    
      virtual DoFoo() = 0;
    
    };
    
    class B : public A
    { 
      protected :
      virtual void DoFoo()
      {
        // Spezieller Code
      }
    };
    

    Damit kann A genau steuern wann B etwas machen kann. Dafür kann aber hier A nur genau einen Codeblock aufrufen.

    Wenn dein Ablauf noch mehr gemischt ist must du eben mehr Funktionen draus machen .

    bis bald
    akari


Anmelden zum Antworten