从CDialog类派生了一个子类CFunc1Dlg,并想重载CFunc1Dlg类的构造函数,
class CFunc1Dlg : public CDialog
{
// Construction
public:
CFunc1Dlg(CWnd* pParent = NULL);   // standard constructor
CFunc1Dlg(CWnd* pParent= NULL,CString reload);////*****错误提示:missing default parameter for parameter 2;
CFunc1Dlg(int a=1,int b);/////其实这也编译不过去,也是提示missing default parameter for parameter 2;
.....打星号的那句是重载构造函数,但是编译不过去,提示说第2个参数必须提供默认值,改成: CFunc1Dlg(CWnd* pParent= NULL,CString reload="");///******reload加了赋默认值,就可以通过编译;
就能编译成功了,可是这是为什么?按理说c++的机制是劝告程序员最好不要有两个默认构造函数的,可是为什么这里编译器反而必须让我重载的构造函数都必须提供全部的参数默认值呢?
请高手指点!附重载构造函数定义实现:
CFunc1Dlg::CFunc1Dlg(CWnd* pParent,CString reload): CDialog(CFunc1Dlg::IDD, pParent)
{
MessageBox(reload);
}

解决方案 »

  1.   


    CFunc1Dlg(CString reload,CWnd* pParent= NULL);默认构造函数必须放在后面!!!
      

  2.   

    CFunc1Dlg(CWnd* pParent= NULL,CString reload);
    因为第一参数已设置了默认值,则后面的所有参数均要设置默认值,这是规定。
    CFunc1Dlg(int a=1,int b);同
    可以定义为
    CFunc1Dlg(CString reload,CWnd* pParent= NULL);
      

  3.   

    注意不要掉了:“: CDialog(CFunc1Dlg::IDD, pParent)”,构造函数对父类的继承
    默认构造函数如:
    CFunc1Dlg(CWnd* pParent = NULL);
    CFunc1Dlg::CFunc1Dlg(CWnd* pParent /*=NULL*/)
    : CDialog(CFunc1Dlg::IDD, pParent)重载的构造函数一样要,如
    CFunc1Dlg::CFunc1Dlg(vector<vec_intandstr> &vec,int col,LPCTSTR str): CDialog(CFunc1Dlg::IDD)