如何在C++中的类中定义常量数组

How do I define a constant array in a Class in C++?

本文关键字:定义 常量 数组 C++      更新时间:2023-10-16

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

class Grade {
    char MAP[];
    char *letter;
public:
    Grade();
    ~Grade();
    void set(int);
};
 Grade::Grade(){
    letter = new char;
    *letter = '';
    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];
}

我该怎么修?

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

代码中还有其他有趣的内容。

1) 它不会按照给定的方式编译(您永远不会定义百分比是什么)
2) 如果有人向映射范围之外的集合函数发送"int a",会发生什么?(IE:56而不是0、1或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];
}

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

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

因此,按照以下char MAP[];声明数组总是会导致编译错误。

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

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

char *MAP;

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

MAP=新字符[n];

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

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

  delete[] MAP;

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