أنا بحاجة إلى إنشاء بسيط رد في c++?يجب استخدام دفعة::وظيفة ؟

StackOverflow https://stackoverflow.com/questions/611892

  •  03-07-2019
  •  | 
  •  

سؤال

لنفترض أن لدي بعض رمز مثل هذا:

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();
}

أنا بحاجة إلى إنشاء بسيطة الاستدعاء التي سيتم استدعاؤها كلما الزائر::زيارة() يسمى.أعلم أنني ربما يجب وضع كود الاستدعاء داخل زائرى ، ولكن في سياق مختلف ، لذا أود أن تمرير callBackFunction() للزائر حتى يتمكن من حقي وظيفة رد الاتصال.

بحثت عن الأشياء على شبكة الإنترنت و رأيت دفعة::وظيفة ، ولكن c++ بالفعل الأساسية functors.

والتي يجب أن تستخدم للحصول على أفضل وضوح الرمز ؟ رد سيكون بسيط الفراغ() وظيفة ، ولكن قد تنمو, أنت لا تعرف أبدا المستقبل :)

ما هي الطريقة الموصى بها من فعل هذا ؟

هل كانت مفيدة؟

المحلول

يمكنك استخدام واجهة رد وهرميته إذا كنت لا تريد استخدام دفعة::وظيفة.

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

إذا كان لديك أو يمكن استخدام دفعة::وظيفة - استخدامه ، بل هو وسيلة جيدة للتخلص من كل تلك الاستدعاء الطبقات.

تحرير:
@edisongustavo:

دفعة::وظيفة دفعة::مأزق لن ربما جعل التعليمات البرمجية الخاصة بك أكثر قابلية للقراءة.ولكن سوف تعطيك فرصة لتمرير خالية وظائف ( أعني وظائف من الدرجة ثابتة وظائف الدرجة ) كما رد فضلا عن المهام الحالية من أي فئة.

مع زيادة الوظائف يمكنك تمرير المهام على سبيل المثال 2 المعلمات حسب الاستدعاء الذي نتوقع معلمة واحدة فقط.

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

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

ولكن مرة أخرى, هذا لن يجعل التعليمات البرمجية الخاصة بك أكثر قابلية للقراءة إلا إذا كان كل فريق يعرف وصالح دفعة.

نصائح أخرى

ونعم دفعة :: وظيفة سيفعل ذلك جيدا. وهذا هو الاستعمال الشائع جدا منه. سوف تحتاج إلى استخدام دفعة :: ربط ربط المثيل إلى وظيفة عضو.

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

وسيكون كيف سيفعل ذلك من داخل الصف.

وتأكد من أن "هذا" لا تختفي أو وظيفة دفعة بك تحطم في منتصف بعض دفعة رأس في مكان ما.

الإجابات أعلاه كبيرة ، ولكن أود فقط أن أشير إلى شيء ذكرتها في سؤالك وهي لا تزال ذات الصلة اختيارك بين C++ رد الكائنات (في ميكولا الجواب) وزيادة.

"الاستدعاء ستكون بسيطة الفراغ() وظيفة ، ولكن قد تنمو, أنت لا تعرف أبدا المستقبل :)"

هذا هو على الارجح أسوأ سبب إضافية لا لزوم لها وظيفة - وهذا هو "فقط في حال كنت في حاجة إليها".إذا كنت لا تعرف - ثم لا تفعل أكثر مما هو ضروري ، وهناك احتمالات تخمين الخاص بك سوف يكون من الخطأ على أي حال, خاصة بحلول الوقت الذي كنت في حاجة إليها.

من ناحية أخرى, إذا كنت تعرف أنه من المرجح للغاية وسوف تحتاج وظيفة قريبا جدا, ثم قد يكون من المفيد إضافتها.

مرة أخرى إلى إعادة تكرار ما ميكولا قال - إذا كان لديك بالفعل زيادة في المشروع الخاص بك فريق يحب ذلك ، ثم استخدام ذلك, لكن على خلاف ذلك قد يكون مبالغة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top