2

arr の前にサイズが定義されている場合、このような配列を作成することができます。

const int size = 5;
int arr[size];

ただし、size と arr がオブジェクトまたは構造体の内部にある場合、それは不可能です。

struct A{
    A(int s) : size(s) 
    {}
    const int size;
    int arr[size]
};

A(5);

なぜそうなのですか?どちらの場合も、配列のサイズはコンパイル時にわかっているため、ちょっと非論理的なようです。

4

7 に答える 7

2

どちらの場合も、配列のサイズはコンパイル時にわかります。

いいえ、const実行時にクラス メンバーを設定できます。

実際、メンバーでなくても常に機能するとは限りません。

int x;
cin >> x;
const int y = x;
int z[y];   //ILLEGAL

を使用するだけstd::vectorです。

于 2012-11-14T11:37:27.787 に答える
2

どちらの場合も、配列のサイズはコンパイル時にわかっているため、ちょっと非論理的なようです。

コンパイラは、あなたの例とこれを区別できません:

int i = std::rand(); // not a compile time constant
A a(i);

一方、コンパイル時に配列のサイズを知る必要があります。の 2 つのインスタンスをA異なるサイズにすることはできません。したがって、配列のサイズは、実行時に設定できるものに依存することはできません。

一方、C++11 はconstexprを提供します。これにより、式を介してコンパイル時の定数を伝播し、これらを使用して配列を初期化できます。

于 2012-11-14T11:37:52.447 に答える
0

コンパイラが A をコンパイルするとき、実際には、それがコンパイル時の引数であるという保証はありません。それはたまたま1つです。私も同じようにできる

int main() {
    std::cin >> i;
    A(i);
}

constexpr 引数を渡したい場合は、テンプレートを使用する必要があります。それ以外の場合は、std::vector のようなランタイム コンテナーを使用する必要があります。

于 2012-11-14T11:38:07.370 に答える
0

std::vector<int>動的にサイズ変更可能な配列が必要な場合は、生の配列の代わりに使用する必要があります。

メンバーに定義された値がないため、classまたは内でやろうとしていることを実行できません。structsize

于 2012-11-14T11:38:14.573 に答える
0

C++ では、C スタイルの配列をサイズ引数で初期化する場合、サイズはコンパイル時の整数定数でなければなりません。

そうしないと、コンパイラはコンパイル時に変数をどのくらいの大きさにするかを知りません。

これが気に入らない場合は、vectorとにかく使用する必要があります。

于 2012-11-14T11:38:24.933 に答える
0

2 番目のケースでは、クラス定義の配列サイズだけを考慮すると、コンパイル時にはわかりません。

そのようなクラスの作成が許可されている場合は、次のように書くことができます

A(5);
A(6);

それはサイズの異なるオブジェクトであり、多くの場合壊れます。たとえば、そのようなオブジェクトを同じ配列に保持することはできません。これらのオブジェクトの型が異なると言うのは論理的であり、クラス テンプレートを作成してサイズをテンプレート パラメーターとして渡すと、それが可能になります。

異なるサイズの配列を使用する場合は、std::vector またはテンプレートを使用します。

于 2012-11-14T11:43:11.400 に答える
-1

コンパイル時にメモリが不明な場合は、ヒープからメモリを動的に割り当てる必要があります。

int* arr = 新しい int [サイズ];

メモリがもう必要ない場合は、配列を削除する必要があります。

削除[] arr;

また、トニーが言ったように、標準のライブラリーベクターを使用することをお勧めします

于 2012-11-14T11:37:09.600 に答える