[英]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
被聲明為B
的static
成員,否則該方法將無效。 您應考慮到需要B
的實例才能調用任何非靜態方法。
(請參閱有關成員函數指針的C ++常見問題解答一章,以進行更深入的說明。)
更新 :如果要實現觀察者模式,則可以聲明一個接口(純抽象類),例如Observer
, A
知道並使用指針到成員函數將事件映射到相應的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的一部分)。
使用類似的東西:
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.