概述
一、C++ slot signal机制的一个简单实现
出处:http://blog.csdn.net/hhyttppd/article/details/4192668
- #include <iostream>
- #include <vector>
- #include <functional>
- #include <algorithm>
- using namespace std;
- class A{
- public:
- void Clicked(int id)
- {
- cout << "A::Clicked" << endl;
- }
- };
- class B{
- public:
- void Clicked(int id)
- {
- cout << "B::Clicked" << endl;
- }
- };
- class SlotBase{
- public:
- virtual void OnSignal(int id) = 0;
- };
- template<class T>
- class Slot : public SlotBase{
- public:
- typedef void (T::*MemberFuncType)(int);
- Slot(T* obj, MemberFuncType func)
- :obj_(obj), func_(func)
- {
- }
- virtual void OnSignal(int id)
- {
- (obj_->*func_)(id);
- }
- private:
- T* obj_;
- MemberFuncType func_;
- };
- template<class T>
- SlotBase* MakeSlot(T * p, void (T::*func)(int))
- {
- return new Slot<T>( p, func ) ;
- }
- class Signal
- {
- public:
- virtual ~Signal()
- {
- std::for_each(slots_.begin(), slots_.end(), SignalDelete());
- }
- struct SignalDelete: public unary_function<SlotBase*, void>
- {
- public:
- void operator()(SlotBase*& slot) const
- {
- delete slot;
- }
- };
- struct SignalAction: public binary_function<SlotBase*, int, void>
- {
- public:
- void operator()(SlotBase*& slot, const int& i) const
- {
- slot->OnSignal(i);
- }
- };
- void signal(int id)
- {
- std::for_each(slots_.begin(), slots_.end(), bind2nd(SignalAction(), id));
- }
- void connect( SlotBase* s)
- {
- slots_.push_back(s);
- }
- protected:
- vector< SlotBase* > slots_;
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- A a;
- B b;
- Signal signal;
- signal.connect(MakeSlot(&a, &A::Clicked));
- signal.connect(MakeSlot(&b, &B::Clicked));
- signal.signal(1);
- return 0;
- }
但是这个实现明显有个潜在的问题。如果main函数是
int _tmain(int argc, _TCHAR* argv[])
{
Signal signal;
{
A a;
B b;
signal.connect(MakeSlot(&a, &A::Clicked));
signal.connect(MakeSlot(&b, &B::Clicked));
}
signal.signal(1); //这里a、b已经析构了。
return 0;
}
有空将提供一个更加可靠的实现。
最后
以上就是尊敬汉堡为你收集整理的C++ slot signal机制的全部内容,希望文章能够帮你解决C++ slot signal机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复