这是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;
}
答案 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:
这是程序可以抛出的标准异常。标准库的某些组件(例如
vector
,deque
,string
和bitset
也会抛出此类型的异常,以指示超出范围的参数。
答案 1 :(得分:0)