5

基本的な 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)
{
}

それを行うと、_ageGroupArray行で「式は変更可能な左辺値でなければなりません」というメッセージが表示されます。コンストラクターで配列オブジェクトを初期化することは完全に不可能ですか? 私が見つけた唯一の解決策は、スコープ識別子の外で配列を定義することでした。これに関する明確化は大歓迎です。

4

3 に答える 3

7

現在の標準では、既にお気づきのように、初期化子リスト構文を使用してコンストラクターでメンバー配列を初期化することはできません。いくつかの回避策がありますが、どれも本当にきれいではありません。

// 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};
于 2011-07-11T07:41:47.770 に答える
5

その後ではなく、 作成/宣言時に配列を初期化できます。

コンストラクターで次のように実行できます。

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

これはInitializationではなくAssignmentであることを知っておくことが重要です。

于 2011-07-11T07:38:12.503 に答える
1

これを試して:

int ageDefault[]={20,32,56,43,72};
memcpy(_ageGroupArray, ageDefault, sizeof(ageDefault));
于 2011-07-11T07:41:36.280 に答える