тестирование «Попробуй и поймай»

В этой программе я использую шаблонный класс, у меня есть файл заголовка, и это мой основной файл. У меня проблемы с отображением («…..«) IndexOutOfBounds и отображение его на экране.

#include "XArray.h"#include <iomanip>
#include <string>

using namespace std;template<class T>
void afriend ( XArray<T> );int main()
{
XArray<double> myAD(18);
myAD.randGen(15, 100);

cout << myAD.getType() << endl;
cout << setprecision(1) << fixed << "\n\n Unsorted:     " << myAD;

myAD.sort();
cout << "\n Now Sorted:     " << myAD;
cout << "\n\n";

**try
{
cout << "A[-5]      = " << setw(6) << myAD[-5] << endl;
}
catch(XArray<double>::IndexOutOfBound e)
{
e.print();
}
try
{
cout << "A[8]       = " << setw(6) << myAD[8] << endl;
}
catch(XArray<double>::IndexOutOfBound e)
{
e.print();
}**cout << "\n\n" << setprecision(2) << fixed;
cout << "Size               = " << setw(6) << myAD.getSize() << endl;
cout << "Mean               = " << setw(6) << myAD.mean() << endl;
cout << "Median             = " << setw(6) << myAD.median() << endl;
cout << "STD                = " << setw(6) << myAD.std() << endl;
cout << "Min #              = " << setw(6) << myAD.min() << endl;
cout << "Max #              = " << setw(6) << myAD.max() << endl;return 0;
}

Существует файл Array.h, опубликованный в виде ссылки на Dropbox

Array.h

Код для operator[] в Array.h есть:

template <class T>
T XArray<T>::operator[] (int idx)
{
if( (idx = 0) && (idx < size) )
{
return Array[idx];
}

else
{
throw IndexOutOfBound();
return numeric_limits<T>::epsilon();
}
}

0

Решение

Проблема в operator[] функция. Код idx = 0 наборы idx в 0, Так что все ваши звонки operator[] вернет первый элемент, и поэтому нет ошибки за пределами допустимого диапазона, если массив не пуст.

Вы, вероятно, хотели написать if ( idx >= 0 && idx < size ),

Кстати throw прерывает функцию, нет смысла return после throw,

0

Другие решения

Хотя вопрос несколько неясен, попробуйте эти предложения.

Во-первых, может случиться так, что XArray<>::IndexOutOfBounds не имеют правильной копии ctor. Вы можете попробовать поймать, используя постоянную ссылку на обходной путь, который:

try
{
...
}
catch(const XArray<double>::IndexOutOfBound& e)
{
e.print();
}

Индексный оператор в стандартных контейнерах библиотеки не проверяет границы, есть специальный метод получения, который называется at(), Если XArray Класс разработан с учетом стандартной библиотеки, он может вести себя аналогично.

Однако, чтобы получить более адекватный ответ, вам нужно быть более конкретным в описании проблемы, с которой вы столкнулись.

1

Мне все еще интересно, что именно за вопрос.
Однако я понимаю, что вопрос в том, как я могу использовать «catch» с помощью «IndexOutOfBound».

#include <exception>
#include <iostream>

using namespace std;

template <typename T>
class Array
{
private:
int m_nLength;
T *m_ptData;

public:
...
...

T& operator[](int nIndex)
{
//assert(nIndex >= 0 && nIndex < m_nLength);

if(nIndex < 0 || nIndex > m_nLength)
{
throw myex;
}
else
{
return m_ptData[nIndex];
}

}

//class definition for 'IndexOutOfBound'
class IndexOutOfBound: public exception
{
public:
virtual const char* print() const throw()
{
return "Exception occured 'Index Out Of Bound'";
}
}myex;
};

int main()
{
Array<double> arr(3);
try
{
arr[0] = 1;
//exception will occur here.
arr[4] = 2;

}
catch(Array<double>::IndexOutOfBound &e)
{
cout << e.print() << '\n';
}return 0;
}

Здесь нет «XArray.h», поэтому я написал пример класса массива для примера.

1
По вопросам рекламы [email protected]