2017-06-21 27 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 等去做簡單的任務(複製/分配/返回)時,它並不會讓我感覺不到什麼煩惱,而且它們不起作用。 –

相關問題