2017-06-21 74 views
1

我有一个结构,称为PERSONS,然后我定义了一个类型CTypedPtrArray<CPtrArray, PERSONS*> PersonsTable;将数据添加到CARRAY给出错误“不能访问类中声明私有成员‘CObject的’”

struct Persons { ... }; 
typedef CTypedPtrArray<CPtrArray, PERSONS*> PersonsTable; 

稍后在代码中我尽量让一个PersonTableCArray

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是如何工作的?

+1

'Persons'和'PERSONS'有什么区别? – Yunnosch

+0

错误消息是否告诉您,无法访问类“CObject”的哪个私有成员? – IInspectable

回答

2

的错误归结为CPtrArray没有定义拷贝构造函数类,增加了oCArr时您的代码使用。编译器生成的默认拷贝构造函数将尝试调用CObject的拷贝构造函数private

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

1

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

*“这是一个巨大的头痛”* - 只有,如果你不明白,为什么事情是他们的方式。复制构造函数被声明为“private”,以免开发人员做错事。在绝大多数情况下,使用指向对象的指针复制容器需要定制逻辑(例如存储指向副本的指针)。如果你希望你的副本指向相同的对象,并且不想自己实现那个定制逻辑,那么使用带有'std :: shared_ptr'而不是'CPtrArray'的'CArray'。 – IInspectable

+0

我明白他们为什么这么做 - 当我用CArray ,CList 等去做简单的任务(复制/分配/返回)时,它并不会让我感觉不到什么烦恼,而且它们不起作用。 –

相关问题