2016-07-08 6 views
1

m_data配列をこのようなメンバーとして使用できないのはなぜですか?CTORによって配列メンバーのサイズが渡されたC++クラス

class Array 
{ 
private: 
    const int m_capacity; 
    int m_data[m_capacity]; 

public: 
    Array(const int capacity = 100); 
}; 


Array::Array(const int capacity /*= 100*/) 
    : m_capacity(capacity) 
{ 

} 

これを動的メモリ割り当てなしでどのように達成できますか?

+0

ラジアンで決定されたサイズの配列は、['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)という綴りです。 –

答えて

5

この場合、コンパイラはclass Arrayのサイズを知ることができず、そのようなオブジェクトのサイズを判断することはできません。不確定なコンパイル時サイズのオブジェクトが許可された場合、言語全体が異なることになります。コンパイル時に容量を知っていれば

しかし、あなたは、それを使用するために、あなたがコメントで述べた

Array<> a; //size = 100 
Array<250> b; //size = 250 

として@Superlokkusを行うことができます次に

template <int Size = 100> 
class Array 
{ 
private: 
    int m_data[Size]; 

public: 
    Array(); 
}; 

を書くことができ、C++ 11 std::arrayは、同じコンセプトのより優れた実装です。

+2

それでは、 'std :: array'がその目的のために作られました – Superlokkus

+0

元の意図を保持するために' static const int m_capacity = Size; 'をプライベートセクションに追加します – mvidelgauz

+0

@mvidelgauz今ではクラスの中で 'Size'を使うことができます。外側に' m_capacity'を使用できませんでした。 'm_capacity'はprivateです –

2

私は、代わりにあなた自身のホイール

#include <array> 
template< unsigned long N > 
using Array = std::array<int, N>; 

そして、あなたは100サイズのアレイ上に注目している場合は、通常のテンプレートクラスとして

Array<100> arr; 

Arrayを使用構築の使用のstd ::配列を示唆していますそれはさらに簡単です

2

このようなテンプレートクラスを宣言できますか?

#include <iostream> 

template <size_t N = 100> 
class Array 
{ 
private: 
    const size_t m_capacity = N; 
    int m_data[N]; 

public: 
    Array(); 
}; 

template <size_t N> 
Array<N>::Array() : m_data {} 
{ 
} 

int main() 
{ 
    Array<> a1; 
    Array<10> a2; 

    return 0; 
} 

それとも、配列の代わりにデータメンバーに

std::vector<int> m_data; 

を使用する必要があります。

+0

ありがとう、このエラー: 'エラーC3867: '配列<100> ::サイズ':標準ではない構文。 '&'を使用してメンバーへのポインタを作成します。私はメンバーの名前が 'size'だったので:) – Narek

0

ダイナミックアロケーションなしで実行時にサイズが選択されるオブジェクトを持つことはできません。あなたは裸のままでそれを持つことができますnew/delete;その要件をカプセル化する通常のクラスはstd::vectorです。

また、異なるサイズのクラスのファミリを持つこともできます。その正規のクラスはstd::arrayです。

関連する問題