使用CArray时出错

时间:2009-05-14 18:12:14

标签: c++ mfc

所以,我试图像这样使用CArray

 CArray<CPerson,CPerson&> allPersons;
   int i=0;
   for(int i=0;i<10;i++)
   {
      allPersons.SetAtGrow(i,CPerson(i));
      i++;
   }

但是在编译我的程序时,我收到了这个错误:

  

“错误C2248:'CObject :: CObject':   无法访问声明的私有成员   在类'CObject'c:\ program中   files \ microsoft visual studio   9.0 \ VC \ atlmfc \包括\ afxtempl.h“

我甚至不明白这是从哪里来的。

HELP!

6 个答案:

答案 0 :(得分:8)

您获得的错误是因为您尝试使用CArray作为我可以收集的返回值。如果您将其从返回CArray更改为接受引用参数,则会进行编译。

试试这个:

class CPerson
{
public:
    CPerson();
    CPerson(int i);
    void operator=(const CPerson& p) {}
private:
    char* m_strName;
};

CPerson::CPerson()
{}

CPerson::CPerson(int i)
{
    sprintf(m_strName,"%d",i);
}

void aFunction(CArray<CPerson,CPerson&> &allPersons)
{
    for(int i=0;i<10;i++)
    {
        allPersons.SetAtGrow(i,CPerson(i));
        i++;
    }
}

答案 1 :(得分:2)

您使用的是CObject的任何Copy构造函数或赋值运算符吗? (CArray源自CObject)

例如:

 CArray<CPerson,CPerson&> allPersons;  

//do something

// This gives the error C2248, cannot access Copy constructor of CObject.
CArray<CPerson,CPerson&> aTemp = allPersons;

OR

你这样做吗?

CArray<CPerson,CPerson&> allPersons; 
...
CArray<CPerson,CPerson&> aTemp;

//Error, as Assignment operator is private
aTemp = allPersons;

修改: 如果要复制CArray中的元素,请编写辅助方法CopyArray()并手动复制元素。

CopyArray(sourceArray, DestArray&)
{
 for each element in SourceArray
 add the element to DestArray.
}

答案 2 :(得分:0)

你的意思是说CArray<CPerson> allPersons;吗?我不知道如何忽略所包含的类型会导致报告的错误,但是......

答案 3 :(得分:0)

CPerson是否来自CObject?它有一个private构造函数吗?您对SetAtGrow()的使用似乎对我来说是正确的。

如果这不起作用,您可以尝试使用Add()功能,因为您的循环似乎不需要SetAtGrow()

答案 4 :(得分:0)

我不完全确定你的问题是什么,但请看一下:Microsoft CObject derived class specifications

您可能想要添加以下代码:

class Person
{
    // ...
    Person( const Person& src );
}

Person::Person( const Person& src ){ Person();*this = src; }

希望它对未来有所帮助。

答案 5 :(得分:0)

如果CPerson是一个复杂的对象,也许您应该考虑使用pointers

   CArray<CPerson*,CPerson*> allPersons;
   int i=0;
   for(int i=0;i<10;i++)
      allPersons.SetAtGrow(i,new CPerson(i));

不要忘记在不再需要时删除阵列的内容

   for(int i=0;i<allPersons.GetSize();i++)
      delete allPersons.GetAt(i);