2016-07-08 46 views
1

爲什麼我不能有m_data數組作爲這樣的成員?C++類與數組成員的大小通過CTOR

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

在runtine中確定大小的數組拼寫['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)。 –

回答

5

在這種情況下,編譯器無法知道class Array的大小,並且無法確定此類對象的大小。如果允許不確定編譯時大小的對象,則整個語言將會不同。

但是,如果你知道在編譯時的容量,你可以寫

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

public: 
    Array(); 
}; 

然後,要使用它,你可以做

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

由於@Superlokkus在評論中提到,C++ 11 std::array只是一個更好的實現,具有相同的概念。

+2

所以提到'std :: array'就是爲了這個墮落而製作的 – Superlokkus

+0

我也會將'static const int m_capacity = Size;'添加到私人部分來保留原意 – mvidelgauz

+0

@mvidelgauz沒有必要,因爲現在他可以在類內使用'Size',並且他不能在外面使用'm_capacity',因爲'm_capacity'是私人的 –

2

我會建議使用std ::數組,而不是建立自己的車輪

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

並使用Array作爲一個正常的模板類

Array<100> arr; 

如果你是熱衷於100大小的數組,它更簡單

using Array = std::array<int, 100>; 
Array arr; 
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

謝謝,我剛剛改變了'N'的大小,我得到這個錯誤:'錯誤C3867:'數組<100> :: size':非標準語法;用'&'來創建一個指向成員的指針哦,我知道了。因爲我有一個成員名'size' :) – Narek

0

不能在運行時選擇大小的對象而不進行動態分配。你可以沒有赤身裸體new/delete;封裝該要求的普通類是std::vector

或者,您可以有一個不同大小的類的家庭。正常的課程是std::array