2012-04-29 16 views
3

たとえば、メンバの配列を持つクラスがあるとします。実行時にメンバ配列サイズを定義する方法

nは、ユーザの入力に基づいて定義された変数である
class myClass { 
    private: 
     int myArray[n] 
    public: 
     myClass(); 
     someOtherMethod(); 
}; 

:それは次のようにして、実行時に/建設時にそのサイズを定義することは可能です。そうでない場合、最良の選択肢は何ですか?

答えて

2

ベクターを使用してください。

class myClass { 
    private: 
     std::vector<int> myArray; 
    public: 
     myClass(); 
     someOtherMethod(); 
}; 

myClass::myClass (int size) 
    : myArray (size) 
{ 
    ... 
} 

次に、配列と同じようにベクターに入力することができます。あるいは、Nawazが指摘するように、新しい要素のための領域を予約するreserve()と、要素を後ろに1つずつ追加するpush_back()を使用します。

+0

なぜ 'resize()'ですか?どうして 'reserve()'をしないの? – Nawaz

+0

@Nawazは、あなたがそれをどのように記入するかによって異なります。どちらもうまくいきますが、配列のように 'resize()'で塗りつぶすこともできます。 – chris

+0

'resize()'を使うと、なぜmem-initializer-listを 'myClass :: myClass(int size):myArray(size){}'として使わないのでしょうか。それはさらにいいです。 – Nawaz

1

クラステンプレートstd::vectorは、この目的のために設計されています。

class myClass { 
    private: 
     std::vector<int> myArray; 
    public: 
     myClass(int size); 
     someOtherMethod(); 
}; 

myClass::myClass(int size) : myArray(size) 
{ 
} 
5

です。

意味的に、配列の3種類がある:固定サイズの

  • アレイは動的サイズ
伴うランタイム
  • アレイに固定されたサイズの
  • アレイは、コンパイル時に

    C++は、それぞれ正規配列とstd::vectorクラスを使用して、最初のケースと3番目のケースを直接サポートしています。

    Cはまた、サポート2つの構築物を有する第二のタイプ:

    • 可変長配列(スタック上の)
    • オールディーズ構造体ハックまたはテールパディング

    私は助言、C++ではstd::vectorクラスを使用しています。必要以上のものを提供しますが、使用するのが簡単です。

    一方、C++の場合でもテールパディングは使用できます。それはしかし、注意深い工学が必要です。

  • 関連する問題