Frage

Angenommen, ich einige Code wie folgt aussehen:

class Visitor {
   public:
      Visitor(callBackFunction) {}
      void visit() {
          //do something useful
          invokeCallback();
      }
}

class ClassThatCanBeVisited {
    Visitor &visitor;

    public:
       ClassThatCanBeVisited(Visitor &_visitor) : visitor(_visitor){}
       void someUsefulMethod() {
          int data= 42;
          visitor.visit(data);
       }
};


void callBackFunction() {
    //do something useful in the context of the Main file
}
int main() {
     Visitor visitor;
     ClassThatCanBeVisited foo(visitor);
     foo.someUsefulMethod();
}

Ich brauche einen einfachen Rückruf zu erstellen, wann immer der Besuch :: Besucher genannt wird () aufgerufen wird. Ich weiß, dass ich wahrscheinlich den Code der Rückruf in meinem Besucher setzen sollte, aber es ist in einem anderen Kontext, so möchte ich die call () an die Besucher weitergeben, damit er meine Callback-Funktion aufrufen kann.

Ich suchte Sachen auf dem Netz und sah boost :: Funktion, sondern c ++ bereits die grundlegenden functors hat.

Welche soll ich für eine bessere Klarheit des Codes verwenden? Der Rückruf wird eine einfache void () Funktion sein, aber es könnte wachsen, man weiß ja nie die Zukunft:)

Was ist der empfohlene Weg, dies zu tun?

War es hilfreich?

Lösung

Sie können mit Callback-Schnittstelle und ihre Hierarchie, wenn Sie boost :: Funktion nicht verwenden möchten.

class VisitorCallback
{
public:
    virtual void handle( const Visitor& ) = 0;
};

Wenn Sie oder Boost verwenden können :: function -. Verwenden Sie es, es ist ein guter Weg von all den Callback-Klassen, um loszuwerden,

Edit:
@edisongustavo:

boost :: function und boost :: bind wird nicht wahrscheinlich Ihren Code besser lesbar machen. Aber es wird Ihnen die Möglichkeit geben, frei Funktionen übergeben (I-Funktionen bedeuten, aus der Klasse und statischen Klassenfunktionen) als Callback sowie bestehende Funktionen jeder Klasse.

Mit Boost-Funktionen, die Sie Funktionen mit zum Beispiel 2 Parameter als Callback übergeben können, die nur einen Parameter erwartet.

typedef boost::function< void ( int ) > IntExpectingCallback;

void TwoIntFunction( int, int );
{
}
...
IntExpectingCallback callback = boost::bind( TwoIntFunction, 5, _1 );

Aber auch hier wird dies nicht der Code besser lesbar machen, es sei denn alle Ihr Team kennt und für Schub.

Andere Tipps

Ja boost :: function würde dies auch tun. Das ist ein sehr verbreiteter Gebrauch davon. Sie müssen Boost verwenden :: binden die Instanz an die Elementfunktion zu binden.

 func = boost::bind( &MyClass::CallbackFunc, this);

wäre, wie würden Sie tun, dass innerhalb der Klasse.

Seien Sie sicher, dass die „this“ nicht verschwinden oder Ihre Boost-Funktion irgendwo in der Mitte einig Boost-Header wird zum Absturz bringen.

Die oben genannten Antworten sind groß, aber ich würde nur etwas, das Sie in Ihrer Frage erwähnt weisen darauf hin,, die auf Ihre Wahl zwischen C ++ Callback-Objekte noch relevant ist (in Mykola Antwort) und Schub.

„der Rückruf wird eine einfache void () Funktion sein, aber es könnte wachsen, man weiß ja nie die Zukunft :)“

Dies ist wahrscheinlich der schlechteste Grund, um zusätzliche, unnötige Funktionalität - das ist „nur, wenn Sie es brauchen“. Wenn Sie nicht wissen - dann nicht mehr tun, als notwendig ist, stehen die Chancen, Ihre Vermutung ohnehin falsch sein wird, vor allem durch die Zeit, die Sie benötigen

.

Auf der anderen Seite, wenn Sie wissen, dass es sehr wahrscheinlich ist, dass Sie die Funktionalität benötigen sehr schnell , dann könnte es sich lohnen, das Hinzufügen es.

Wieder, erneut auf, was Mykola sagte -., Wenn Sie bereits Auftrieb haben in Ihrem Projekt und Ihrem Team mag es, dann verwenden, aber ansonsten kann es zu viel des Guten

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top