鉴于下次没有描述清楚,那贴已结,再描述一次,小弟我想要的"多态"
鉴于上次没有描述清楚,那贴已结,再描述一次,我想要的"多态"
有一个A类,它的dosomething函数行为,想于调用它的B类决定
这是A类的框架
class A
{
public:
dosomething();
}
有人给出多态思路,直接继承
但我想要的,是将来A可能放在类似CDialog这样的类里,作为成员变量
CMyDialog:public CDialog
{
A a;
假如我现在想把每个vtelement显示在这个Dialog的一个CMyEdit上。
假如像上面B那样实现,operateVt函数,是不能在还没有CMyDialog的时候,更没有CMyEdit,确定operateVt里的函数怎么写。也不可能让operateVt函数里包含
CMyEdit.setwindowtext()这样的代码。
}
所以,我为什么一直对函数指针念念不忘,
但这个成员函数指针非常复杂,不是这么简单就能实现的。所以困惑啊
------解决方案--------------------
feel the power of template
------解决方案--------------------
直接让CMyDialog继承自A和CDialog,就不需要在CMyDialog里 A a这个成员变量了,直接调用A的函数就好了。
然后再在CMyDialog里实现纯虚函数operateVt操作CEdit;
有一个A类,它的dosomething函数行为,想于调用它的B类决定
这是A类的框架
class A
{
public:
dosomething();
}
class A
{
//有一个vector,需要在dosomething中被遍历
vector vt;
public:
dosomething()
{
for(int i=0;i<vt.size();i++)
{
这里对每个vt[i]的操作,需要由另一个类来决定
}
}
}
有人给出多态思路,直接继承
class A
{
public:
void dosomething();
virtual operateVt(vtelement) = 0;
}
class B: public A
{
//实现operateVt
operateVt(vtelement)
{
cout<< vtelement<<endl;
}
}
但我想要的,是将来A可能放在类似CDialog这样的类里,作为成员变量
CMyDialog:public CDialog
{
A a;
假如我现在想把每个vtelement显示在这个Dialog的一个CMyEdit上。
假如像上面B那样实现,operateVt函数,是不能在还没有CMyDialog的时候,更没有CMyEdit,确定operateVt里的函数怎么写。也不可能让operateVt函数里包含
CMyEdit.setwindowtext()这样的代码。
}
所以,我为什么一直对函数指针念念不忘,
class A
{
//有一个vector,需要在dosomething中被遍历
vector vt;
public:
//这里传入一个函数指针作为参数
dosomething(Fun_Ptr fp)
{
for(int i=0;i<vt.size();i++)
{
(*fp)(vt[i]);
}
}
}
CMyDialog:public CDialog
{
A a;
showtext(vtelement)
{
myedit.setwindowtext(vtelement);
}
void somefun()
{
a.dosomething(showtext);
}
}
但这个成员函数指针非常复杂,不是这么简单就能实现的。所以困惑啊
------解决方案--------------------
feel the power of template
class A
{
vector<int> vt;
public:
template <class T>
T dosomething(T func)
{
return for_each(vt.begin(), vt.end(), func);
}
};
// maybe you want to print to console?
class B
{
public:
void operator() (int val)
{
cout << val;
}
};
// or maybe you want to write to a file?
class C
{
public:
C(const string &filename)
{
fp_ = ofstream(filename.c_str());
}
void operator() (int val)
{
fp_ << val;
}
private:
ofstream fp_;
};
int main(void)
{
A a;
// print to console
a.dosomething(B());
// save to file
a.dosomething(C("123.txt"));
return;
}
------解决方案--------------------
直接让CMyDialog继承自A和CDialog,就不需要在CMyDialog里 A a这个成员变量了,直接调用A的函数就好了。
然后再在CMyDialog里实现纯虚函数operateVt操作CEdit;