有个指针问题想请教一下,我在MFC对话框程序中添加了TabCtrl,然后创建了10个子对话框,分别显示在TabPage上,针对这10个对话框都创建了CDialog的派生类,且创建了它们的成员,属于上层的对话框类。假设MFC对话框程序类名为CDlg_main,10个子对话框类为CDlg_child1,CDlg_child2...在CDlg_main中添加针对子对话框的10个成员:m_Child1, m_Child2...现在我想用一个通用的指针,分别指向这10个子对话框,且能访问子对话框类中的成员,该如何定义指针呢?
   我用了CDialog* p_Dlg_comm,在使用某个子对话框时,强制转换为相应的子对话框类,结果不成,用static_cast<>也不行,也不能访问子对话框类中的成员。请问如何定义通用指针,分别指向不同的子对话框类,且能访问其成员呢?
谢谢!

解决方案 »

  1.   

    就是你说的这样啊。CDialog * p_child[10];
    p_child[0] = new CMyDialog(...);CMyDialog * dlg = dynamic<CMyDialog *>(p_child[0]);
    dlg->DoSomeThing();
      

  2.   

    是不是我没有说明白?
    我在类CDlg_main中有10个成员:m_Child1,m_Child2...它们都分别指向10个对话框,另外我还在CDlg_main中添加了一个CDialog* p_Dlg_comm指针,我现在想在运行时把p_Dlg_comm转换为当前显示的子对话框类型,且指向这个当前显示的对话框,能访问该对话框中的成员。跟a_rockboy说的不太一样。
      

  3.   

    把你定义的指针在各个对话框的初始化函数里进行一一赋值。
    然后定义一个对话框指针数组 CDialog* m_pDlgs[10];
    然后对其赋值 m_pDlgs[0] = m_Child1,m_pDlgs[1] = m_Child2.....
    以后调用m_pDlgs[0]就指向第一个对话框,m_pDlgs[1]指向第二个对话框。
      

  4.   

    CDlg_child1 * m_Child1;
    CDialog* p_Dlg_comm;m_Child1=(CDlg_child1 *)p_Dlg_comm;
    肯定能转换成功。
      

  5.   

    to yuhudie203:这样应该可以,可是太麻烦,我有很多个其他的菜单和子对话框,需要在这10个对话框上显示,界面是一样的,就是内容不太一样,且需要根据用户在子对话框上的操作设置这10个对话框之一,如果定义一个数组的话,比较麻烦。
      

  6.   

    可以直接用CDialog*,如果要访问CDialog之外的成员,需要从CDialog派生一个,定义这些成员,在用该类作为所有子对话框的基类,在主对话框中使用该基类类型的指针。
      

  7.   

    to shequay:这样是可以,可是我要的是反过来,把p_Dlg_comm转换为子对话框的类型。
      

  8.   

    有个想法,你可以试试:
    写CBaseDlg 继承CDialog; 关键是在类里定义虚函数接口,如:virtual CWnd* GetThisDlgItem(int ID);并设置标记m_iDlgID,是哪个对话框;
    然后自己的10个对话框CMyDlg继承CBaseDlg; 改写virtual,根据ID处理,
    这样,设置当前对话框CBaseDlg *pDLg->GetThisDlgItem()就不用强制转换了。不知道是不是这个意思...
      

  9.   

    to m_tornado:这种方法之前我Google了一下,有一些人说基类转换为子类时用到,问题是现在我很多代码都完成了,如果重新定义成这种派生类的话,修改起来也比较麻烦。其实我就是想知道能否实现一个通用的CDialog*指针,分别指向不同的CDialog派生类,能进行类型转换,如果可以,该如何转换,并且能访问到派生类里面的成员。
      

  10.   

    你的子对话框再抽象出来一个基类。
    将共同的函数和类变量都放到基类中通过基类就可以访问你在子对话框了。用的时候直接通过子对话框变量去访问这些共用的函数和变量即可
    class CSubBaseDlg : public CDialog
    {
    public:
    virtual int func() = 0;

    protected:
    int m_int;
    }class CDlg_child1 : public CSubBaseDlg
    {
    public:
    virtual int func() = 0;

    protected:
    int m_int;
    }
      

  11.   


    你现在的子对话框就是一个派生类来的,再抽象一个基类只是在你现在的对话框和CDialog这个类中间再插入一层而已
    一点都不麻烦。其实你想要的通用指针是也只能是通过基类指针才能访问的
    你可以定义成通用的CDialog*指针,这样你就可以随便访问CDialog相关的函数和变量你派生类中特殊的成员肯定需要你的派生类才能访问
    除非你将他抽象出来到一个基类中再用基类来访问。不知这样说有没有说清楚了呢?