ошибка при использовании CArray - PullRequest
4 голосов
/ 14 мая 2009

Итак, я пытаюсь использовать 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 файлы \ Microsoft Visual Studio 9.0 \ VC \ atlmfc \ включать \ afxtempl.h "

Я даже не понимаю, откуда это.

HELP!

Ответы [ 6 ]

8 голосов
/ 14 мая 2009

Ошибка, которую вы получаете, заключается в том, что вы пытаетесь использовать 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++;
    }
}
2 голосов
/ 14 мая 2009

Вы используете какой-либо конструктор Copy или оператор присваивания CObject? (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;

EDIT : Если вы хотите скопировать элементы в CArray, напишите вспомогательный метод CopyArray () и скопируйте элементы вручную.

CopyArray(sourceArray, DestArray&)
{
 for each element in SourceArray
 add the element to DestArray.
}
0 голосов
/ 17 января 2017

Если CPerson сложный объект, возможно, вам следует рассмотреть возможность использования указателей

   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);
0 голосов
/ 17 июля 2015

Я не совсем уверен, в чем заключалась ваша проблема, но взгляните также на это: Спецификации класса, производного от Microsoft CObject .

Возможно, вы захотите добавить этот код:

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

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

Надеюсь, это поможет в будущем.

0 голосов
/ 14 мая 2009

Является ли CPerson производным от CObject? Есть ли у него конструктор private? В противном случае ваше использование SetAtGrow() мне кажется правильным.

Если это не сработает, вы можете попытаться вернуться к использованию функции Add(), поскольку вашему циклу не требуется SetAtGrow().

0 голосов
/ 14 мая 2009

Вы хотите сказать CArray<CPerson> allPersons;? Я не знаю, как исключение этого типа приведет к сообщенной ошибке, но ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...