在分析ACE的原码时发现有一种平时比较少见的调用方式,记得以前有人用C++描述Command时也用了这种方式,不过他们的代码都包装为模板,不方便理解.这里,我不用模板简单的展示其特点:
#include <iostream>
using namespace std;
class CA
{
public:
CA()
{
cc = 1;
};
int func1(int a, int x)
{
cout<<"func1"<<endl;
cc = a + x;
cout<<"cc is :"<< cc <<endl;
return cc;
}
int func2(int a, int y)
{
cout<<"func2"<<endl;
cc = cc + a * y;
cout<<"cc is:"<<cc<<endl;
return cc;
}
typedef int (CA::*FUNC)(int a, int y);
int Test1()
{
FUNC f;
f = &CA::func2;
return (this->*f) (10, 20);
}
int test2(FUNC func,int a, int b)
{
//ACE中是先做一些共同的复杂的事,然后调用不同的func部分:
return (this->*func)(a,b);
}
private:
int cc;
};
int main( void )
{
CA a;
a.Test1();
a.test2(&CA::func2,11,3);
return 0;
}
很酷!调用者可以把类的函数作为参数传递.
好再开下面,利用继承的关系,我们还可以做到同样效果:
#include <iostream>
using namespace std;
class CB
{
public:
virtual int func1(int a, int x)=0;
virtual int func2(int a, int x)=0;
typedef int (CB::*FUNC)(int a, int y);
int Test1()
{
FUNC f;
f = &CB::func2;
return (this->*f) (10, 20);
}
int test2(FUNC func,int a, int b)
{
return (this->*func)(a,b);
}
};
class CA:public CB
{
public:
CA()
{
cc = 1;
};
int func1(int a, int x)
{
cout<<"func1"<<endl;
cc = a + x;
cout<<"cc is :"<< cc <<endl;
return cc;
}
int func2(int a, int y)
{
cout<<"func2"<<endl;
cc = cc + a * y;
cout<<"cc is:"<<cc<<endl;
return cc;
}
private:
int cc;
};
int main( void )
{
CB *pB = new CA();
pB->Test1();
pB->test2(&CB::func2,11,3);
delete pB;
return 0;
}
上面的例子如果应用到Command模式中,func1 和func2就可以分别是Execute 跟 UnDo的接口了.至于如何实现,就是派生类的问题了.
(上述代码均在MinGW中测试通过)
posted on 2009-02-25 17:32
名羽 阅读(1676)
评论(3) 编辑 收藏 引用 所属分类:
c++& vc