4

以下に定義された小さな C++ プログラムがあります。

class Test
{
   public:
   int a;
   int b[a];
};

コンパイルすると、次のエラーが発生します。

testClass.C:7:5: error: invalid use of non-static data member ‘Test::a’
testClass.C:8:7: error: from this location
testClass.C:8:8: error: array bound is not an integer constant before ‘]’ token

エラー メッセージの意味を知るにはどうすればよいですか? また、どのように修正すればよいですか?

4

3 に答える 3

6

動的に割り当てない限り ( などを使用new[])、C++ の配列にはサイズとしてコンパイル時の定数が必要です。AndTest::aはコンパイル時の定数ではありません。それはメンバー変数です。

于 2012-05-05T07:11:33.930 に答える
6

この背後にある完全な理由を調べてみましょう。まず最初にクラスを宣言するとき、メンバー変数にはメモリが割り当てられていないため、パブリック メソッドまたはプライベート メソッドには値がありません。それはあなたのための簡単なヒントでした.今あなたの問題のために:

静的に宣言された配列は関数のスタックフレームに存在し、コンパイラは正確に割り当てるメモリの量を知る必要があるため、コンパイルの前に配列サイズを知る必要があるため、クラスの外でこれを行うことはできません。プログラマによってサイズ変更されるメモリ内の唯一のセグメントは、ヒープです。したがって、動的に割り当てられた配列サイズが必要な場合はいつでも、ヒープに常駐するように宣言する必要があり、次のように行います。

int a;
cin >> a;
int * b = new int[a];

これは、未知のサイズ (実行時に決定されるサイズ) の配列を宣言する正しい方法です。これをクラスと統合する方法は次のとおりです。クラスのプライベートまたはパブリック属性にはメモリがないことを思い出してください。それらは単なる宣言です。メンバーメソッド内またはクラス外のどこかに初期化を含めないでください-これは、あなたの場合のようにパブリックであるためです-そしてもちろん、クラスのインスタンスを宣言した後、たとえばTest t. とにかく、クラス内でそれを行う方法は次のとおりです。

class Test
{
public:
int a;
int * b;
Test(int Ia=1) {
    a = Ia;
    b = new int[a];
}
~Test() {
    delete[] b;
}
};

デストラクタの代わりに使用する理由については、C++ の delete と delete[] 演算子を参照してください。delete[]delete

于 2012-05-05T07:26:15.053 に答える