1

この質問をどのように提示するか正確にはわからないので、いくつかのサンプルコードから始めます。

//header file
class A
{
public:
    A();
private:
    int x;
    std::string arr[x];
}

//cpp file

class A
{
public:
    A()
    {
     /*code to get the value of x from a cmd call*/
    }
}

このコードは有効ですか?具体的には、Aオブジェクトが作成されるまでxに値が指定されていなくても、ヘッダーファイルの文字列配列のサイズをxにすることはできますか?

これが機能しない場合、動的に割り当てられた配列を使用する他の唯一のオプションはありますか?

4

5 に答える 5

5

コードが無効です。代わりにベクトルを使用する必要があります。

class A
{
public:
    A();
private:
    int x;
    std::vector<std::string> arr;
};

A::A () : x(command_gets_x()), arr(x) {}

はのarr値で初期化されるためx、コンストラクターは(定義内のように)先行する場合にのみ機能しますx。ただし、配列のサイズを追跡することが唯一の目的である場合は、aにメソッドがあるため、これは必要ありません。arrAxvectorsize()

class A
{
public:
    A() : arr(command_gets_x()) {}
    int x () const { return arr.size(); }
    //...
private:
    std::vector<std::string> arr;
};
于 2012-07-31T23:12:13.720 に答える
3

無効です。配列サイズは定数式である必要があります。はい。必ずしも直接ではありませんが、動的割り当てを使用する必要があります。std::vectorを使用できます。

于 2012-07-31T23:12:45.410 に答える
2

いいえ、それは不可能です。1つのC ++には可変長配列がなく、さらに、配列サイズはコンパイル時定数でなければなりません。

コンストラクターで、を使用して配列を割り当てることができます。newまたは、を使用することをお勧めしますstd::vector

于 2012-07-31T23:12:36.237 に答える
1

いいえ、非定数式で配列を初期化することはできません。これは機能し、元の意図に近いものです。

class A
{
   ...
   const int x = 3;
   std::string arr[x];
};

そして、.cppファイルでは:

int A::x;
于 2012-07-31T23:14:57.710 に答える
0

私のMacでは、xコードで次のことができることがわかりました

int x = foo() // get some value for x at runtime
int array[ x ];

しかし、それはひどくクールではありません!昨日、一部のコンパイラがスタックでの動的割り当てを許可していることを読みましたが、それを十分に避けておくことをお勧めします。

xの値が実行時までわからない場合、実行時までサイズxの配列を割り当てることはできません。コンパイラの機能について考えてみてください。xの大きさがわからない場合、サイズxの配列を割り当てることができますか?残りの唯一のオプションは、実行時に割り当てることです(別名動的割り当て)。

于 2012-07-31T23:54:58.693 に答える