簡體   English   中英

向CArray添加數據會產生錯誤“無法訪問在類'CObject'中聲明的私有成員”

[英]Adding data to CArray gives error “cannot access private member declared in class 'CObject'”

我有一個名為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是如何工作的?

錯誤歸結為類CPtrArray未定義復制構造函數,您的代碼在添加到oCArr時使用。 編譯器生成的默認復制構造函數將嘗試為CObject調用復制構造函數,該對象被聲明為private

您可能應該直接將元素添加到oCArr ,而不是將它們添加到局部變量然后進行復制。

1201是正確的,這是一個巨大的頭痛。 如果您被迫使用MFC集合,則可以從它們派生並創建自定義復制構造函數/賦值運算符。 (和move + 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;
    }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM