ネコナゾ娘 (・∀・)

C++点滴

C++博客 联系 聚合 管理
  6 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks
      由于一年多没有写过代码了,所以最近才开始工作总是感觉有点难,而且很累的感觉。比如上周就遇到了一个小问题,问题是这样的,我负责编写一个简单的界面,使用的是MFC。当时随便阅读了一些公司的代码,然后匆匆忙忙的开公了。等出了Demo之后,被负责人验收的时候各种吐槽,最后修改以后就入库了,算是一周的工作完成了。
      可是,当我下周再编译的时候,就不行了,有编译错误(就是编译错误!!!)。我看到编译器给出的提示是 error C2512: 'CDialogEx' : no appropriate default constructor available(翻译过来就是没有默认的构造函数)。出现问题的地方是
     
Util_IPFilter(BOOL &bBlack , CArray<CString , CString> aList)
{
   CUI_IPFilter dlg(bBlack , aList);
   
return dlg.ShowModel();
}
     
       我一看CDialogEx 不是 CUI_IPFilter 的父类么  class CUI_IPFilter : public CDialogEx { ... }
然后我去看了下CDialogEx的声明:

class CDialog : public CDialog , public CDataStructBase
{
public:
    CDialog(UINT uIDTemplete , CWnd
* pParent = NULL);
    
~CDialog();
private:
    .
    .
    .
}

       不是好好的么,只好去百度了下,这下明白了,原来子类构造的时候,要先构造父类,而父类有自己的构造函数,所以编译器就不会默认给他一个无参数的构造函数了,于是便产生了上面的这样的错误。明白了,就容易了,随便添加了一个资源,加了对话框模板 IDD_IPF,再在 CUI_IPFilter 的构造函数改成

CUI_IPFilter::CUI_IPFilter(BOOL &bBlack , CArray<CString , CString> &aList): CDialogEx(IDD_IPF)
{
    
}

       于是,一切就都正常了,然后我又浏览了一下,发现了一篇好文章 多重继承和void*的糗事 ,它解释了为什么构造子类时必须先构造父类,以及为什么子类可以转换成父类,而父类不能转换成子类,一切都是C++对象的内存模型决定的,可惜我以前看《C++对象模型》的时候那样不耐烦。

        
posted on 2012-03-21 14:33 neko::nazo 阅读(264) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理