C ++代码改进,数组越界

时间:2015-04-27 22:53:47

标签: c++ arrays class operator-overloading

这是Array的类模板。我重载了[ ]运算符,希望它能解决超出界限的问题。问题。打印输出效果很好,除非它超出范围,编译器默认启用范围并显示6位数字。

也许正在寻找一种更好的方法来使用适当的元素编号初始化数组以获得更好的检查,如果在查找元素时它确实超出范围,则显示错误。

// implement the class myArray that solves the array index 
// "out of bounds" problem.

#include <iostream>
#include <string>
#include <cmath>

using namespace std;

template <class T>
class myArray
{
    private:
        T* array;
        int begin;
        int end;
        int size;

    public:
        myArray(int);
        myArray(int, int);

        ~myArray() { };

        void printResults();

        // attempting to overload the [ ] operator to find correct elements.
        int operator[] (int position)
        {if (position < 0)
            return array[position + abs(begin)];
        else
            return array[position - begin];
        }
};


template <class T>
myArray<T>::myArray(int newSize)
{
        size = newSize;
        end = newSize-1;
        begin = 0;
        array = new T[size] {0};
}

template <class T>
myArray<T>::myArray(int newBegin, int newEnd)
{
    begin = newBegin;
    end = newEnd;
    size = ((end - begin)+1);
    array = new T[size] {0};
}

// used for checking purposes.
template <class T>
void myArray<T>::printResults()
{
    cout << "Your Array is " << size << " elements long" << endl;
    cout << "It begins at element " << begin << ", and ends at element " << end << endl;
    cout << endl;
}

int main()
{
    int begin;
    int end;

    myArray<int> list(5);
    myArray<int> myList(2, 13);
    myArray<int> yourList(-5, 9);

    list.printResults();
    myList.printResults();
    yourList.printResults();

    cout << list[0] << endl;
    cout << myList[2] << endl;
    cout << yourList[9] << endl;

    return 0;
}

2 个答案:

答案 0 :(得分:3)

首先,您的operator[]不正确。它被定义为始终返回int。一旦实例化某些内容的数组,您就会收到编译时错误,这些内容不能隐式转换为int

应该是:

T& operator[] (int position)
{
    //...
}

,当然还有:

const T& operator[] (int position) const
{
    //you may want to also access arrays declared as const, don't you?
}

现在:

  

我重载了[]运算符,希望它可以修复&#34;超出范围&#34;问题。

你没有修理任何东西。您只允许阵列的客户端定义自定义边界,仅此而已。考虑:

myArray<int> yourList(-5, 9);
yourList[88] = 0;

您的代码是否会检查此类out-of-bounds个案例?否。

你应该这样做:

int operator[] (int position)
{
    if((position < begin) || (position > end)) //invalid position
        throw std::out_of_range("Invalid position!");
    //Ok, now safely return desired element
}

注意,抛出异常通常是这种情况下的最佳解决方案。引自std::out_of_range doc:

  

这是程序可以抛出的标准异常。标准库的某些组件(例如vectordequestringbitset也会抛出此类型的异常,以指示超出范围的参数。

答案 1 :(得分:0)

重新定义数组类的更好选择是使用std库中的容器。 Vectorarray(由c ++ 11支持)。它们都有一个重载的运算符[],因此您可以访问数据。但是使用push_back(for vector)方法添加元素并使用at方法访问它们可以消除机会或超出范围错误,因为at方法会执行检查,如果需要,push_back会调整向量的大小。