下面这段代码为啥编译会报错
class CUITreeCtrl : public CObject
{
DECLARE_SERIAL(CUITreeCtrl)
//predefine
struct ITEM{
CString strName;
CArray<ITEM> arSub;
};
//function
public:
CUITreeCtrl(void);
~CUITreeCtrl(void);
//control function
inline void AddItem(ITEM& it){m_arItems.Add(it);}protected://variable
protected:
CArray<ITEM> m_arItems;
};而如果把结构体item中的CArray<ITEM> arSub;改成CArray<ITEM>* parSub;就不会报错
class CUITreeCtrl : public CObject
{
DECLARE_SERIAL(CUITreeCtrl)
//predefine
struct ITEM{
CString strName;
CArray<ITEM> arSub;
};
//function
public:
CUITreeCtrl(void);
~CUITreeCtrl(void);
//control function
inline void AddItem(ITEM& it){m_arItems.Add(it);}protected://variable
protected:
CArray<ITEM> m_arItems;
};而如果把结构体item中的CArray<ITEM> arSub;改成CArray<ITEM>* parSub;就不会报错
class CArray :
public CObject
----------
CArray有两个参数
CString strName;
CArray<ITEM> arSub;
};
只能自含指针, 因为无法确定大小
CString strName;
CArray<ITEM> arSub;
};不能嵌套自身(无法确定大小)。因为ITEM*(4个字节) 与ITem是两种不同类型,就可以了
CArray 的sizeof跟模板类型无关,它是有个指针指向这个模板类型的数组
//control function
inline void AddItem(ITEM& it){m_arItems.Add(it);}这个函数也不会报错
error C2248: “CObject::operator =”: 无法访问 private 成员(在“CObject”类中声明)
1> d:\program files\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(535) : 参见“CObject::operator =”的声明
1> d:\program files\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(509) : 参见“CObject”的声明
1> 此诊断出现在编译器生成的函数“CArray<TYPE> &CArray<TYPE>::operator =(const CArray<TYPE> &)”中
1> with
1> [
1> TYPE=CUITreeCtrl::ITEM
1> ]
CObject的赋值和拷贝构造都是private的,任何从CObject派生的类都不能直接赋值和拷贝构造,除非自己实现。
AddItem(ITEM& it){m_arItems.Add(it);}虽然传了个引用,但是把it放到m_arItems里应该要用到拷贝构造吧,由于你没有实现,就调用默认的,这里拷贝的细节请参考effctive C++记得好像是第46条款把。