나는 보통 std :: vector와 비슷한 방식으로 동작하는 내 자신의 벡터 클래스를 만들었습니다 (이 작업을 위해이 작업을 수행해야했습니다). 이제 누군가가이 벡터 클래스에 액세스 할 수있는 메모리 범위를 벗어나 뭔가를 쓰려고하면 오류가 발생하고 프로그램이 종료되는지 확인하고 싶습니다.오류가 발생했을 때 throw 할 클래스 만들기
내 시도 : 범위 부족 오류로 실행할 수 있습니다 내 벡터 멤버 함수에서 이제
template<typename T>
class vector
{
private:
T *elements;
int sz;
public:
// vector functions etc. //
struct out_of_range
{
string s;
out_of_range(string b) : s{b} {cerr << "error: " << s << endl;}
};
};
,이 클래스를 던져. 이 작품, 다음과 같은 메시지와 함께 프로그램을 종료 지금
if(i < 0 || sz <= i) throw out_of_range("index out of range");
:
이error: index is out of range terminate called after throwing an instance of 'vector::out_of_range' Aborted (core dumped)
내 질문이이 경우 [] 내 연산자 오버로딩의 예를 들어,이 같은 검사를 올바른 접근법. 내가 가지고있는 함수에서 cerr을 허용 했는가? 나는이 함수를 잡아 내지 않고 단순히 던질 수 있을까? 내가 아는 한, 전화를받지 않고 던지면() 바로 종료됩니까? 이 나쁜 코딩 실천인가요?
내가 혼란스러워하지 않고 내 질문에 다소 이해할 수 있기를 바랍니다. 사전에 도움을 주셔서 감사합니다 :)
편집 : 죄송합니다. 나는 std :: string과 기본 입력 및 출력과 같은 몇 가지 기본적인 것들을 제외하고는 자신을 만들지 않은 수업을 사용할 수 없습니다.
['std :: out_of_range'] (http://en.cppreference.com/w/cpp/error/out_of_range)를 재사용하는 방법은 무엇입니까? 또는 다른 표준 예외 클래스 중 하나를 사용/상속 ([이 참조 예 등] (http://en.cppreference.com/w/cpp/error)에 설명되어 있음)? –
여기에서 요점은 재사용이 아니라고 생각합니다 (전체 벡터 구성 요소를 재사용해야하기 때문에). 그러나 데이터 구조 작성에 대해 배우십시오. – Doleron
@Doleron 당신은 절대적으로 정확합니다. 나는 그것을 잊어 버렸기 때문에 글을 편집했습니다. 사용할 클래스를 만들고 std :: string 및 std :: cout/cerr/cin 만 사용할 수 있습니다. – JuliusAF