向CArray添加数据会产生错误“无法访问在类'CObject'中声明的私有成员”

时间:2017-06-21 18:01:04

标签: c++ mfc

我有一个名为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()有关,因为当我删除受尊重的行时,它会被“修复”。

为什么会出现错误?我该如何解决? CArray是如何工作的?

2 个答案:

答案 0 :(得分:2)

错误归结为类CPtrArray未定义复制构造函数,代码在添加到oCArr时使用该构造函数。编译器生成的默认复制构造函数将尝试调用CObject的复制构造函数,该构造函数被声明为private

您可能应该直接将元素添加到oCArr,而不是将它们添加到局部变量然后复制。

答案 1 :(得分:1)

1201是正确的,这是一个巨大的头痛。如果您被迫使用MFC集合,则可以从它们派生并创建自定义复制构造函数/赋值运算符。 (和move + initializer_list)数组集合有一个Copy函数,可以用来简化生活。

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;
    }
};