所以,我试图像这样使用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!
答案 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);