我定义了一个自己的类CMyLabel,继承自CObject,
内有:
CMyLabel();
CMyLabel(CMyLabel &label);
CMyLabel operator=(CMyLabel &label);
virtual ~CMyLabel();DOC定义:
#include <afxtempl.h>
.......
CObArray m_LabelArray;
CMyLabel *m_pLabel;
在DOC的类中,如下两行代码出错:
m_pLabel=(CMyLabel*)new CMyLabel;
pDoc->m_LabelArray.Add((CMyLabel*)m_pLabel);
error C2512: 'CMyLabel' : no appropriate default constructor available
error C2664: 'Add' : cannot convert parameter 1 from 'class CMyLabel *' to 'class CObject *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

解决方案 »

  1.   

    Add那里改成Add((CObject*)m_pLabel);此句前面应该还有m_pLabel->Create(...);第一个错误没搞懂。
      

  2.   

    不需要Create的吧,我这个类虽然名字为MyLabel,实际上只是在界面上面手工画一个方框,我觉得不需要。这两行代码,我在别的程序里面看到过,没有问题的。,
      

  3.   

    不同意:回复人: lsgt() ( ) 信誉:99 
    Add那里改成Add(*(CObject*)m_pLabel);//至于是CObject还是CMyLabel都 无所谓。
    CObject有 Create(...)方法吗??你的CMyLabel不是窗口吧?如果要那种标签的效果,那要继承于CStatic比较好。第一个报错没有合适的默认构造函数可以调用。
      

  4.   

    不好意思,我搞错了,回复人: lsgt() ( ) 信誉:99 没错
    我查了
    CObArray::Add 
    int Add( CObject* newElement );
    throw( CMemoryException );
      

  5.   

    lsgt() 上说的是对的,改成基类后,编译是可以通过的。
    所以,CObArray::Add 应该是要填写基类指针的。不过Create就没有了吧,我的又不是窗口类。
      

  6.   

    要用(CObject*)转。看一下MSDN的CObArray.Add的帮助。原型就是:
    CObArray::Add 
    int Add( CObject* newElement );
    throw( CMemoryException );不是一个窗口,确实不需要Create。第一个问题,明明他上面代码里有默认constructor,所以不明白。
      

  7.   

    我已经解决问题了,解决过程如下:1 ,我在DOC中使用的是class CMyLabel,而不是#include "MyLabel.h",我这么做的目的是防止重复定义,没有想到给这里造成这么大的麻烦了。2 , 改成基类指针类型就编译通过。谢谢楼上的各位。