Инициализация массива в классе C ++ и модифицируемая проблема lvalue - PullRequest
5 голосов
/ 11 июля 2011

У меня есть базовый класс C ++. Заголовок выглядит так:

#pragma once
class DataContainer
{
public:
    DataContainer(void);
   ~DataContainer(void);
    int* getAgeGroup(void);
    int _ageGroupArray[5];
private:

     int _ageIndex;

};

Теперь внутри файла cpp класса я хочу инициализировать _ageGroupArray [5] со значениями по умолчанию внутри конструктора класса следующим образом:

#include "DataContainer.h"


DataContainer::DataContainer(void)
{

_ageGroupArray={20,32,56,43,72};

_ageIndex=10;
}

int* DataContainer::getAgeGroup(void){
return _ageGroupArray;
}
DataContainer::~DataContainer(void)
{
}

Делая это, я получаю «Выражение должно быть изменяемым lvalue» в строке _ageGroupArray. Так что совершенно невозможно инициализировать объект массива в конструкторе? Единственное решение, которое я нашел, состояло в том, чтобы определить массив вне идентификаторов области. Любое разъяснение этого будет очень признательно.

Ответы [ 3 ]

7 голосов
/ 11 июля 2011

В текущем стандарте, как вы уже заметили, вы не можете инициализировать массив-член в конструкторе с помощью синтаксиса списка инициализатора. Есть некоторые обходные пути, но ни один из них не очень хорош:

// define as a (private) static const in the class
const int DataContainer::_age_array_size = 5;

DataContainer::DataContainer() : _ageIndex(10) {
   int tmp[_age_array_size] = {20,32,56,43,72};
   std::copy( tmp, tmp+_age_array_size, _ageGroupArray ); 
}

Если значения в массиве всегда одинаковы (для всех объектов в классе), то вы можете создать одну его статическую копию:

class DataContainer {
   static const int _ageGroupArraySize = 5;
   static const int _ageGroupArray[ _ageGroupArraySize ];
// ...
};
// Inside the cpp file:
const int DataContainer::_ageGroupArray[_ageGroupArraySize] = {20,32,56,43,72};
5 голосов
/ 11 июля 2011

Вы можете инициализировать массив, когда вы создаете / объявляете его, но не после этого.

Вы можете сделать это в конструкторе следующим образом:

_ageGroupArray[0]=20;
_ageGroupArray[1]=32;
_ageGroupArray[2]=56;
_ageGroupArray[3]=43;
_ageGroupArray[4]=72;

Важно знать, что это Назначение , а не Инициализация .

1 голос
/ 11 июля 2011

попробуйте это:

int ageDefault[]={20,32,56,43,72};
memcpy(_ageGroupArray, ageDefault, sizeof(ageDefault));
...