【问题标题】:How do I define a constant array in a Class in C++?如何在 C++ 的类中定义常量数组?
【发布时间】:2013-02-09 03:27:57
【问题描述】:

我希望在一个类中定义一个数组,并将类的变量设置为数组的元素。下面的实现会导致分段错误:

class Grade {
    char MAP[];
    char *letter;
public:
    Grade();
    ~Grade();
    void set(int);
};
 Grade::Grade(){
    letter = new char;
    *letter = '\0';

    MAP[0] = 'A';
    MAP[1] = 'B';
    MAP[2] = 'C'; // result in segmentation fault

    MAP = { 'A', 'B', 'C'}; // result in segmentation fault
    }

Grade::~Grade(){
    delete letter;
    delete percent;
}

void Grade::set(int a){
    *letter = MAP[a];
}

我应该如何解决它?

【问题讨论】:

    标签: c++ arrays class


    【解决方案1】:

    最快的方法是将char MAP[];改为char MAP[3];

    代码中还有其他有趣的东西。

    1) 它不会按照给定的方式编译(你永远不会定义百分比是什么)。
    2) 如果有人向您的设置函数发送了一个超出地图范围的“int a”,会发生什么? (即:56 而不是 0、1 或 2)?

    【讨论】:

      【解决方案2】:

      对您打算执行的代码进行一些假设,看来最简单的解决方法是替换当前代码

      char MAP[];
      char *letter;
      
      ...
      
      void Grade::set(int a){
          *letter = MAP[a];
      }
      

      char letter_;
      
      ...
      
      void Grade::set( int const grade )
      {
          // Assuming grade in range 1 through 5 inclusive.
          letter_ = "ABCDEF"[grade - 1];
      }
      

      顺便说一句,为宏保留全部大写的标识符是个好主意。这样可以最大限度地减少意外文本替换的可能性。此外,它对眼睛更容易。

      【讨论】:

        【解决方案3】:

        如果是数组,编译器会要求您显式声明数组中的元素数量。这是为了确保在执行之前确定数组的大小。

        因此,如下声明数组char MAP[]; 将始终导致编译错误。

        您的问题可能的解决方案是 [如 David D 所述] 将其声明为 char MAP[3];

        但是,如果您的要求是动态分配,您可以将其声明为

        char *MAP;
        

        并在构造函数内部按如下方式分配所需的内存:

        MAP = 新字符[n];

        其中 n 表示数组中需要的元素数。

        注意:如果动态声明数组需要使用

          delete[] MAP;
        

        在销毁期间完成释放内存。

        【讨论】:

          猜你喜欢
          • 2011-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-06
          • 2022-11-16
          相关资源
          最近更新 更多