2011-10-13 44 views
1

美好的一天傢伙。在C++中重載下標[]運算符以設置類(量詞)的大小。

我有以下的結構和類,

template <class T> 
struct Node 
{ 
    T DataMember; 
    Node* Next; 
}; 

template <class T> 
class NCA 
{ 
    public: 
     NCA(); 
     ~NCA(); 
     void push(T); 
     T pop(); 
     void print(); 
     void Clear(); 
    private: 
     Node<T>* Head; 
     void* operator new(unsigned int); 
}; 

我想與一個大小

即實例化​​的類。 NCA [30]作爲一個將任何陣列

回答

5

您對象構造函數,它將如何知道您是否試圖創建大小爲30的NCA或者包含30個NCA對象的數組? C++不允許你重寫括號語法,除非作爲一個運算符,否則你已經有了一個對象。

1

你不能。

您只能使用構造函數來做到這一點,如:

NCA n(30); 
+0

謝謝大家 - 感嘆它讓我傷心。我真的想這樣做....然後,我只需要在榮譽編譯器構造,然後修復這個小錯誤 :) –

3

這倒不怎麼operator[]作品。

當你寫NCA[30]你寫type[30],其中以使用operator[]你需要一個實例

NCA inst; 
inst[30]; 

你能雖然做的是使用一個整數模板參數指定大小,如:

#include <utility> 

template <std::size_t N> 
class NCA { 
    char bytes[N]; 
}; 

int main() { 
    NCA<1024> instance; 
} 
+0

給大家:我道歉 - awoodland是絕對正確的 - 我的意思是 NCA nca [30] 然後使用nca –

6

你不能。但是,你可以做一些事情幾乎一樣:與括號初始化它,而不是括號:

NCA<int> myList(30); 

像這樣實現:如果編譯器,讓您在使用括號

template <class T> 
class NCA 
{ 
    ... 
    public: 
    explicit NCA(std::size_t count); 
    ... 
}; 

template <class T> 
NCA<T>::NCA(std::size_t count) { 
    ... allocate Head, &c ... 
    while(count--) 
    push(T()); 
} 
+3

構造函數應該是'explicit'以避免'size_t'自動轉換爲'NCA'。 – reima

+0

謝謝,@reima。 –