2011-11-12 7 views

答えて

5

いいえ、不可能です:sizeが動的変数である限り、array[size]は静的配列として実装できません。

好きな人は、このように考えてください。sizeof(test)は、コンパイル時にわかっている必要があります(たとえば、testの配列を考えてください)。しかし、あなたの仮説の例ではsizeof(test) == sizeof(int) * (1 + size)です。これはコンパイル時の既知の値ではありません!

sizeをテンプレートパラメータにすることができます。それが唯一の解決策についてです:

template <unsigned int N> 
class Test 
{ 
    int array[N]; 
    static const unsigned int size = N; // unnecessary really 
public: 
    // ... 
}; 

使用法:今、私たちはsizeof(Test<N>) == sizeof(int) * (1 + N)を持ってTest<50> x;

注、各Nため、Test<N>が別個あるので、コンパイル時に値を知られた事実であるタイプ。

+0

+1。これまでのところ、他の答えよりも優れています! – Nawaz

+0

これは、クラス固有の静的整数定数のアプローチのテンプレートバージョンではありませんか? –

+0

@Als:「クラス固有の静的整数」がテンプレートパラメータを介して作成者によって指定できるようになっています。 –

2

を与えるあなたは、固定サイズの配列を意味しますか?あなたは、このようなstd::arrayを使用することができます。

#include <array> 

class test 
{ 
    static const size_t s_size = 50; 
    std::array<int, s_size> m_array; 
public: 
    test() 
    { 
    } 
}; 

それともあなたは、このようなクラステンプレートに頼る必要があり、異なるサイズをサポートする場合:

#include <array> 

template <size_t SIZE> 
class test 
{ 
    std::array<int, SIZE> m_array; 
public: 
    test() 
    { 
    } 
}; 

std:arrayするサイズ情報を保持する追加の利点を持っています(ポインタに崩壊する配列とは異なります)、標準ライブラリアルゴリズムと互換性があります。

Boostが提供するバージョン(boost::array)も同様です。

+0

私は50の代わりに定数のクラス変数を使用したいと思います。これを行う方法はありますか? –

+0

コンパイル時定数の場合のみ。答えのコードを更新しました。 –

1

コンパイラは各メンバーのデータ型のサイズを知る必要があるため、コードではエラーが発生します。 int arr[N]メンバのタイプarrを書くときは、N個の整数の配列です。ここで、Nはコンパイル時に知られていなければなりません。

一つの解決策は、列挙型を使用している:

class test 
{ 
    enum 
    { 
     size = 50 
    }; 

    int arr[size]; 
    public: 
    test() {} 
}; 

もう一つは、クラスの静的なconstメンバとしてサイズを宣言されていますイン・クラスの初期化は唯一の静的クラスの整数のために許可されていること

class test 
{ 
    static const int size = 50; 
    int arr[size]; 
    public: 
    test(){} 
}; 

注意を!他のタイプの場合は、コードファイルで初期化する必要があります。