自定义索引运算符C ++

时间:2014-04-07 00:15:52

标签: c++ arrays class

我无法构建一个类,通过构建一个模仿数组行为的类来确保用户不访问数组末尾的元素,但添加了一个检查。也就是说,这个类将创建一个给定类型的元素序列,并允许使用[]括号运算符访问这些元素,但它会检查以确保用户不会尝试对不具有该元素的元素执行某些操作不存在。

以下是构建它的说明。

我不知道如何为这种情况制作索引运算符。请帮我。谢谢!

这是我到目前为止的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)
{

}

2 个答案:

答案 0 :(得分:0)

最简单/最干净的事情是从std::vector(或std::array,如果它更适合您的目的)派生,只要您不那么{{1使用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); }
};

答案 1 :(得分: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];
    }
};