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

时间:2013-02-09 03:27:58

标签: c++ arrays class

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

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

我该如何解决?

3 个答案:

答案 0 :(得分:3)

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

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

1)它没有按照给定的编译(你永远不会定义百分比是多少) 2)如果有人向您的地图范围之外的集合函数发送“int a”会发生什么? (IE:56而不是0,1或2)?

答案 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];
}

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

答案 2 :(得分:1)

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

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

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

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

char *MAP;

并在构造函数内部分配所需的内存,如下所示:

  

MAP = new char [n];

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

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

  delete[] MAP;
在破坏期间

完成释放内存。