2

クラスで配列を定義し、クラスの変数を配列の要素に設定したいと考えています。以下の実装では、セグメンテーション違反が発生します。

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

どうすれば直せますか?

4

3 に答える 3

3

最も簡単な方法は、に変更char MAP[];することですchar MAP[3];

コードには他にも興味深いものがあります。

1)与えられたとおりにコンパイルされません(パーセントが何であるかを定義することはありません)。
2) マップの範囲外にある set 関数に誰かが "int a" を送信した場合はどうなりますか? (IE: 0、1、または 2 の代わりに 56)?

于 2013-02-09T03:31:51.530 に答える
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];
}

ところで、マクロ用にすべて大文字の識別子を予約しておくことをお勧めします。そうすることで、意図しないテキスト置換の可能性を最小限に抑えることができます。また、目にもやさしいです。

于 2013-02-09T03:35:29.130 に答える
1

配列の場合、コンパイラでは、配列内の要素の数を明示的に宣言する必要があります。これは、実行前に配列のサイズが確実に決定されるようにするためです。

したがって、次のように配列を宣言すると、char MAP[];常にコンパイルエラーが発生します。

あなたの問題の考えられる解決策は、[DavidDが述べたように]それをchar MAP[3];として宣言することです。

ただし、動的割り当てが必要な場合は、次のように宣言できます。

char *MAP;

コンストラクター内で、必要なメモリーを次のように割り当てます。

MAP = new char [n];

ここで、nは、配列内で必要な要素の数を示します。

注:配列を動的に宣言する場合は、を使用する必要があります

  delete[] MAP;

破壊中にメモリを完全に解放します。

于 2013-02-09T04:00:46.153 に答える