2014-04-07 84 views
0

我在構建一個確保用戶不訪問數組末尾的元素的類時遇到了問題,方法是構建模仿數組行爲的類,但添加了一個檢查。也就是說,這個類將創建一個給定類型的元素序列,並允許使用[]括號運算符訪問這些元素,但它會檢查以確保用戶不會嘗試對某個元素執行某些操作不存在。自定義索引運算符C++

以下是關於構建它的說明。

我不知道如何使這種情況下的索引操作符。請幫幫我。謝謝!

這裏是我的3個文件,我有那麼遠,

dvd.h

class dvdArray{ 

    dvd *elt; 
    int size; 
    static int defaultSieze; 
    int getSize(); 
    void display(); 




    dvdArray(unsigned int sz); 
    dvdArray(); 
    dvdArray(dvdArray &obj); 
    ~dvdArray(); 

}; 

dvd.cpp

dvd::dvd(){ 
    id =0; 
    int n=5; 

    title = new char [n]; 
    director = new char [n]; 



    title[0] = '\0'; 

    director[0] = '\0'; 

} 
dvd::~dvd(void) 
{ 

} 
dvdArray::dvdArray(unsigned int sz){ 
    elt = new dvd[sz]; 
} 
dvdArray::dvdArray(){ 
    size = defaultSieze; 
    elt = new dvd[defaultSieze]; 

} 
dvdArray::dvdArray(dvdArray &obj){ 

    size = obj.size; 
    elt = new dvd[defaultSieze]; 
    for (int i=0; i!='\0'; ++i) { 
     elt[i]=obj.elt[i]; 

     } 

} 
dvdArray::~dvdArray(void) 
{ 

} 
+0

請參閱[這個答案](http://stackoverflow.com/questions/4421706/operator-overloading)。 – Emmet

+0

確保您始終在您的構造函數中設置成員'大小'。然後檢查索引。 – dan

回答

0

做最簡單的/清潔的事情就是獲得從std::vector(或std::array,如果它更適合你的目的),這是安全的,只要你沒有delete對象使用std::vector*,只要你想要做的檢查接入接受的參數作爲checked_vector而不是std::vector*/& ...

實例的功能:

template <typename T> 
class checked_vector : public std::vector<T> 
{ 
    public: 
    // ...forwarding constructors 
    using std::vector::vector; 

    T& operator[](size_t n) { return at(n); } 
    const T& operator[](size_t n) const { return at(n); } 
}; 

注:不會保護你免受非法使用迭代器,如增加它們太遠或向它們添加非法偏移量。

如果 - 不管是什麼原因 - 你決定使用自己的實現......

dvd& dvdArray::operator[](size_t n) 
{ 
    if (n >= size) 
     throw std::runtime_error("invalid array index"); 
    return dvd[sz]; 
} 

const dvd& dvdArray::operator[](size_t n) const 
{ 
    if (n >= size) 
     throw std::runtime_error("invalid array index"); 
    return dvd[sz]; 
} 
0

我會做一些簡單..通用陣列,邊界檢查... 不知道爲什麼你將需要但是...向量是一個很好的替代陣列。

template <typename T> class myArray{ 
    size_t size; 
    T *arr; 
    void allocate(size_t s){ 
     if(s<1) arr = NULL; 
     else arr = new T[s]; 
     size = s; 
    } 
public: 
    myArray(){ allocate(10); } //default constructor 
    myArray(size_t s){ allocate(s); } 
    ~myArray(){ if(arr!=NULL) delete[] arr; arr=NULL; } 
    T& operator[] (size_t s) { 
     if(s>=size) throw Error(); //or do whatever 
     else return arr[s]; 
    } 
};