12

クラスのプライベートメンバーとして配列(現時点ではサイズは不明)を宣言し、後でクラスのコンストラクターでサイズを設定できるかどうか疑問に思っていました。例えば:

class Test {
int a[];
public:
Test(int size);
};

Test::Test(int size) {
a[size];   // this is wrong, but what can i do here?
}

これは可能ですか、それとも動的配列を使用する必要がありますか? ありがとう!

4

7 に答える 7

17

短い答え: いいえ (配列のサイズはコンパイル時にのみ定義されます)
長い答え:

ベクトルを使用して同じ結果を得ることができます。

class Test
{
    std::vector<int> a;
    public:
        Test(std::size_t size):
            a(size)
        {}
};
于 2008-11-26T20:48:57.770 に答える
16

いいえ、これは不可能です。ヘッダーの配列宣言には、定数サイズの値が必要です。そうしないと、"sizeof" のような構造が正しく機能しません。配列をポインター型として宣言し、コンストラクターで new[] を使用する必要があります。例。

class Test { 
    int *a;
public:
    Test(int size) {
       a = new int[size];
    }
    ~Test() { delete [] a; }
private:
    Test(const Test& other);
    Test& operator=(const Test& other);
};
于 2008-11-26T20:49:24.460 に答える
4

他の回答が指摘しているように、配列のサイズはコンパイル時に固定されます。ただし、テンプレートを使用すると、コンパイル時にサイズをパラメーター化できます。

template <int N> class Test {
    int a[N];
public:
    Test() { }
};

Test<5> test;
Test<40> biggertest;

この手法では、(動的ソリューションのように)実行時にサイズを計算することはできませんstd::vectorが、ニーズによってはこれで十分な場合があります。

于 2008-11-26T20:52:01.257 に答える
3

まず第一に、コンストラクターの本体ではなく、コンストラクターの初期化リストで物事を初期化する方が一般的に優れています。

コンパイル時に境界がわかっている場合にのみ、定義済みの境界で配列を初期化できます。この状況では、スペースを動的に割り当てる必要があります。

その場合、オブジェクトが破棄されたときに配列を削除するデストラクタがあることを覚えておく必要があります。そうしないと、メモリ リークが発生します。

于 2008-11-26T20:48:55.787 に答える
2

Martinのソリューション(use std::vector)を参照してください。また、C APIにバッファーを渡す必要がある場合でも、次のように渡すstd::vectorことでそれを実行できることを覚えておいて&vec[0]ください。

std::vector<char> vec(10);
memset(&vec[0], 0, vec.size());

動作は保証されていますが、ベクトルが空でない場合に限ります(C ++の癖、<ため息>)。

于 2008-11-26T21:08:01.037 に答える
0

いいえ、これは不可能です。などの動的配列を使用する必要がありますstd::vector。C99 では、構造体がサイズのない配列を最後のメンバーとしてのみ持つことができますが、これを行う場合でも、malloc().

于 2008-11-26T20:49:39.140 に答える
0

あなたが話していることは不可能です。クラスのサイズは常に一定です。クラスに動的に割り当てられた配列へのポインターを使用させるか、std::vector を使用することができます。

于 2008-11-26T20:58:11.823 に答える