【问题标题】:error using CArray使用 CArray 时出错
【发布时间】:2009-05-14 18:12:13
【问题描述】:

所以,我尝试像这样使用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 文件\微软视觉工作室 9.0\vc\atlmfc\include\afxtempl.h"

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

帮助!

【问题讨论】:

  • 看来问题与 CObject 有一个私有构造函数有关。我应该采取什么步骤来解决问题?期待您的来信,谢谢。
  • 这个循环中有两个 i++ 语句,但这可能不是问题的原因。
  • 您确定列出的错误来自您显示的代码吗?
  • crashmstr,是的,错误来自我显示的代码。
  • 在下面查看我的更新。代码编译。从某种意义上说这是非常错误的,但它可以编译(并且它是从您的 sn-p 评论中获取的)

标签: c++ mfc


【解决方案1】:

您遇到的错误是因为您试图使用 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++;
    }
}

【讨论】:

  • CArray 已模板化,但无法正确显示。请看修改后的版本。
  • 这是我的功能:问题是否与它有关? CFeed aFunction() { CArray allPersons;诠释我=0; for(int i=0;i
  • 是的。那就是问题所在。 CArray 不能像看起来那样返回。
  • 这就是问题所在。您的函数 aFunction() 尝试调用 CArray 的复制构造函数,它在 CObject 中定义为私有。请参考我的回答
  • 您也可以更改函数的签名以将CArray&作为输入参数并在循环中修改。
【解决方案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;

你在做这个吗?

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.
}

【讨论】:

  • 不,我没有做你提到的任何事情。我只是这样做了: CArray allPersons;诠释我=0; for(int i=0;i
  • 这段代码看起来是正确的。你能发布CPerson的定义吗? CPerson 是否有可能从 CObject 派生?
  • //person.h class CPerson { public: CPerson(); CPerson(int i);私人:char* m_strName; } //person.cpp CPerson::CPerson() { } CPerson::CPerson(int i) { sprintf(m_strName,"%d",i); }
  • 我认为这与 CArray 尝试调用 CObject 的构造函数但该构造函数是私有的事实有关。如何规避?
  • 我刚刚编译了你所拥有的,它可以工作(有语法修复)
【解决方案3】:

你的意思是CArray&lt;CPerson&gt; allPersons; 吗?我不知道省略包含的类型会如何导致报告的错误,但是...

【讨论】:

  • 马克,我认为你错了(也许),但我认为它应该是 CArray(CPerson,CPerson&> allPersons。它需要 2 个参数。
  • 第二个参数是可选的,如果省略则和第一个参数一样。
【解决方案4】:

CPerson 是从 CObject 派生的吗?它有private 构造函数吗?否则,您对 SetAtGrow() 的使用对我来说似乎是正确的。

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

【讨论】:

    【解决方案5】:

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

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

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

    希望对未来有所帮助。

    【讨论】:

      【解决方案6】:

      如果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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多