我有一个名为PERSONS
的结构,然后我定义了一个类型CTypedPtrArray<CPtrArray, PERSONS*> PersonsTable;
struct Persons { ... };
typedef CTypedPtrArray<CPtrArray, PERSONS*> PersonsTable;
在代码的后面,我尝试做一个PersonTable
CArray
:
void CArrayTesting()
{
CArray<PersonsTable, PersonsTable> oCArr;
oCArr.SetSize(3);
PersonsTable perTableA;
PersonsTable perTableB;
PersonsTable perTableC;
for (int i = 0; i < 10; i++)
{
if (i < 3) addPerson(perTableA, i);
else if (i < 8) addPerson(perTableB, i);
else addPerson(perTableC, i);
}
oCArr.Add(perTableA);
oCArr.Add(perTableB);
oCArr.Add(perTableC);
for (int nArrCnt = 0; nArrCnt < oCArr.GetSize(); nArrCnt++)
for (int i = 0; i < oCArr.ElementAt(nArrCnt).GetSize(); i++)
{
cout<<"Table "<< nArrCnt << " - " << oCArr.ElementAt(nArrCnt)[i]->nID << endl;
delete oCArr.ElementAt(nArrCnt)[i];
}
}
addPerson()
函数将数据添加到PersonTable
。
但是,这会导致编译过程中出现错误:cannot access private member declared in class 'CObject
。该错误似乎与oCArr.Add()
有关,因为当我删除受尊重的行时,它会得到"修复"。
为什么会出现错误?我该如何解决它?卡雷是如何工作的?
错误归结为类CPtrArray
未定义复制构造函数,您的代码在添加到oCArr
时使用。 编译器生成的默认复制构造函数将尝试调用 CObject
的复制构造函数,该构造函数被声明为 private
。
您可能应该直接将元素添加到oCArr
中,而不是将它们添加到局部变量然后进行复制。
1201 是正确的,这是一个非常令人头疼的问题。如果强制使用 MFC 集合,则可以从它们派生并创建自定义复制构造函数/赋值运算符。(并移动 + initializer_list(数组集合有一个复制功能,您可以使用它使生活变得简单。
class CPtrArrayEx : public CPtrArray
{
public:
CPtrArrayEx() = default;
CPtrArrayEx(CPtrArrayEx const& rhs)
{
Copy(rhs);
}
CPtrArrayEx& operator=(CPtrArrayEx const& rhs)
{
if (this != &rhs)
Copy(rhs);
return *this;
}
};