2017-10-21 15 views
0

나는 보통 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과 기본 입력 및 출력과 같은 몇 가지 기본적인 것들을 제외하고는 자신을 만들지 않은 수업을 사용할 수 없습니다.

+1

['std :: out_of_range'] (http://en.cppreference.com/w/cpp/error/out_of_range)를 재사용하는 방법은 무엇입니까? 또는 다른 표준 예외 클래스 중 하나를 사용/상속 ([이 참조 예 등] (http://en.cppreference.com/w/cpp/error)에 설명되어 있음)? –

+0

여기에서 요점은 재사용이 아니라고 생각합니다 (전체 벡터 구성 요소를 재사용해야하기 때문에). 그러나 데이터 구조 작성에 대해 배우십시오. – Doleron

+0

@Doleron 당신은 절대적으로 정확합니다. 나는 그것을 잊어 버렸기 때문에 글을 편집했습니다. 사용할 클래스를 만들고 std :: string 및 std :: cout/cerr/cin 만 사용할 수 있습니다. – JuliusAF

답변

0

Java와는 다른 C++에서는 throw 이외의 특정 요소를 사용하여 throw 문을 사용할 수 있습니다. 그래서 구조체는 (int 형처럼) 예외를 던지기위한 표현식 매개 변수로 사용하기에 적당합니다. 당신이 당신의 프로그램을 작성하는 OOP 접근 방식을 사용하고 있기 때문에

그러나, 당신은 또한 당신의 예외 클래스 대안을 적용해야합니다 :

#include <iostream> 
#include <exception> 
using namespace std; 

class myexception: public exception { 

    virtual const char* what() const throw() { 
     return "My exception happened"; 
    } 
} myex; 

int main() { 

    try { 
     throw myex; 
    } catch (exception& e) { 
     cout << e.what() << '\n'; 
    } 
    return 0; 
} 

here에서 촬영.

첫 번째 인상은 두 대안이 동일하다는 것입니다. 구조체 기반의 클래스 기반의 이점은 클래스를 사용하면 더 복잡하고 크고 긴 수명의 시스템을 프로그래밍 할 때 유용 할 수있는 객체 지향 접근 방식에 의해 제공되는 재사용, 확장, 캡슐화 등의 이점을 추출 할 수 있다는 것입니다.

관련 문제