簡體   English   中英

指向類成員函數的指針

[英]Pointer to a class member function

假設我有兩節課

class A
{
  public:
    void foo( /* ............. */ );
};

class B
{
   public:
      void bar();
};

我想知道,如果它甚至有可能要傳遞給foo方法的指針bar方法,將其存儲在A與運行bar后來從A 我應該說, A不會知道,哪個bar是會員!

如果您向我展示該主題的語法或鏈接不那么復雜,我將不勝感激。

描述我正在為C ++設計observer模式。 我想讓B參加A一些活動。 例如,此代碼應在B的實例中

   // pseudo code    
   A* observable = new A();
   observable->addEventListener ( 'eventTitle' , functionName );

eventTitle發生時, A調用B functionName

除非bar被聲明為Bstatic成員,否則該方法將無效。 您應考慮到需要B的實例才能調用任何非靜態方法。

(請參閱有關成員函數指針C ++常見問題解答一章,以進行更深入的說明。)

更新 :如果要實現觀察者模式,則可以聲明一個接口(純抽象類),例如ObserverA知道並使用指針到成員函數將事件映射到相應的Observer方法。

例:

   A observable;
   observable.addEventListener ( 'eventTitle' , &B::functionName );
   B observer;
   observable.registerObserver(&observer);

A如何在不了解B情況下使用B的成員函數? 要調用它,您需要一個對象,該對象必須是B型(或子類型),因此A必須具備這一知識。

如果您將bar()設為靜態函數,則可以使用常規函數指針( void (*)() )或std::function<void ()> (對於較老的C ++為boost::function )-我強烈建議您使用后者。

有兩種方法可以調用指向成員函數的指針,以隱藏其起源:

  • 使用std :: function和std :: bind:

     class B { double Sqrt(int what) { return std::sqrt((double)what); } }; // in A: std::tr1::function<double (int)> fn; fn = std::tr1::bind(&B::Sqrt, &operations, std::tr1::placeholders::_1); fn(3.1415); 
  • 使用函子,該函子將指向成員函數的指針和將在其上被調用的對象togeter包裹起來。 (不過,這有點復雜,並且原則上只是std :: function的一部分)。

  • 從抽象接口IFn派生B並將B作為IFn引用傳遞給Foo。 Foo將知道要調用什么-接口的虛擬Do()函數。

使用類似的東西:

class A
{
public:
  void foo( /* ............. */ );
  void SetObs(CObs *pObs)
  {
    m_pObs = pObs;
  }

private:
  CObs *m_pObs;
};

class B : public class CObs
{
public:
  virtual void bar();
};

class CObs
{
public:
  virtual void bar() = 0;
};

並且每當需要bar()函數時,請調用m_pObs-> bar()。 還可以從COb派生所有類似B的分類,並覆蓋功能bar()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM