【问题标题】:Intitialzing an array in a C++ class and modifiable lvalue problem在 C++ 类中初始化数组和可修改的左值问题
【发布时间】:2011-07-11 07:36:22
【问题描述】:

我有一个基本的 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 行上得到“表达式必须是可修改的左值”。那么在构造函数中初始化数组对象是完全不可能的吗?我找到的唯一解决方案是在范围标识符之外定义数组。对此的任何澄清将不胜感激。

【问题讨论】:

  • 为什么要定义一个空的析构函数?不用管它。
  • 男人,仅用于示例目的:)

标签: c++ arrays lvalue


【解决方案1】:

在当前标准中,您已经注意到,您不能在构造函数中使用初始化列表语法初始化成员数组。有一些解决方法,但没有一个真的很漂亮:

// 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};

【讨论】:

    【解决方案2】:

    您可以在创建/声明数组时初始化数组,而不是在那之后。

    你可以在构造函数中这样做:

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

    重要的是要知道这是分配而不是初始化

    【讨论】:

      【解决方案3】:

      试试这个:

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

      【讨论】:

      • 这有点危险,因为它只对 POD 类型有效,而对所有其他类型都静默失败(未定义的行为)。
      • @zabulus 谢谢,这样就可以了。但是你能向像我这样的菜鸟解释一下为什么我不能在类实例化时直接初始化 -ageGroupArray 吗(我的意思是不使用 memcpy )?跨度>
      • @Michael 简单的答案是:因为没有支持它的语法。 (我认为这在 C++11 中已得到修复。)我认为没有语法的原因是 C 样式数组在 C++ 中被视为二等公民,有点;如果您使用std::vector,您可以使用两个迭代器构造函数从静态 C 样式数组构造它。另外,关于@David:他对memcpy 的看法是正确的,但是有一个标准函数std::copy 可以使用。
      • @James 感谢您的澄清
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2010-09-14
      • 2021-06-08
      • 2019-08-02
      • 2011-07-21
      • 1970-01-01
      相关资源
      最近更新 更多