首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

鉴于下次没有描述清楚,那贴已结,再描述一次,小弟我想要的"多态"

2013-01-28 
鉴于上次没有描述清楚,那贴已结,再描述一次,我想要的多态有一个A类,它的dosomething函数行为,想于调用它

鉴于上次没有描述清楚,那贴已结,再描述一次,我想要的"多态"
有一个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;


另外成员函数指针可以使用function/bind,VS2008在std::tr1命名空间里,最新的编译器则直接在std里。这是新标准支持的。
[解决办法]

引用:
引用:再看一遍我在那贴里的回复,把on_data 改成你这里的showtext就是你要的东西。
DIP原则,接口依赖
你的代码里
class B :public A::I_parser {

我的B想要继承自CDialog的话,怎么办?

c++的类支持多继承啊,再多个父类有什么问题

热点排行