2013-10-11 2 views
0

저는 C++을 처음 사용하고 예외 처리 방법을 배우고 있습니다. 다른 유형의 두 변수를 추가하려고하면 프로그램에서 예외가 발생하기를 원합니다. 컴파일 할 때 불일치 오류와 +가 두 유형에서 작동하지 않는다는 메시지가 표시되지만 대신 예외를 throw하려고합니다.데이터 불일치 예외를 throw하는 방법

#include <iostream> 
#include <stdexcept> 
#include <typeinfo> 
using namespace std; 

int main() { 
    try{ 
     int var1 = 6; 
     string var2 = "7"; 
     if (typeid(var1).name() == typeid(var2).name()){ 
      cout << var1 + var2; 
     } else { 
      throw 99; 
     } 
    }catch (int e){ 
     cout << "caught a " << e << endl; 
    } 
} 
+12

정적 프로그래밍 오류를 잡기 위해 동적 예외 처리가 필요하지 않다는 점을 메타 수업에서 알 수 있습니다. –

+5

"컴파일 할 때 불일치 오류가 발생하지만 대신 예외를 throw하려고합니다."- ** 이유 **? 그것은 전혀 이해가되지 않습니다. 이것은 런타임 예외가 아니라 컴파일 오류 인 좋은 일입니다. –

+0

'typeid (var1) .name() == typeid (var2) .name()'은 포인터를 비교하기 때문에 실제로 아무것도 의미하지 않는다. –

답변

0

잘 모르겠어요,하지만 당신은 일을 당신의 코멘트에 무엇을 설명 같은 아무것도, 당신 필요 상속 : 당신은 정말하지만 당신이 할 수있는, 원하는 경우. 템플릿 클래스의 모든 비교가 일어나는 공통 기본, 에서 파생해야합니다 파생 된 각 클래스에서

private: 
    virtual void doBinaryFunction(Base const& other) const = 0; 
public: 
    void binaryFunction(Base const& other) const 
    { 
     if (typeid(*this) != typeid(other)) { 
      throw std::runtime_error("Type mismatch"); 
     } 
     doBinaryFunction(other); 
    } 

당신에게 Derived const&static_castBase const& 다음 수행해야하는 무엇이든.

혼합 유형을 처리하려면 double 형태의 양식이 필요합니다.

이 추가되는 유형이 다른 "추가"구현에 대해서도 언급합니다. 여기서 문제는 덧셈에 추가되는 타입에 따라 리턴 타입이 이라는 것입니다. 보통 이것을 처리하는 방법은 정식 유형 (예 : double)을 결정하는 것입니다. 이 경우 가장 좋은 해결책은 정규형으로 값을 반환하는 일종의 가상 함수를 제공하고, 정규형을 추가하고 을 반환하는 것입니다.

결코 적게, 이것은 매우 나쁜 디자인을 때린다. 첫째, 코스의 경우 fordchevy을 '추가'하지 않고 속도를 합산하려고합니다. 그것은 단지 의미가 없습니다. 에 관계없이 구현 한 후, (I 두 관련이없는 자동차의 속도를 추가하는 중 의미가 생각하지 않지만)하지만 당신은 ford.speed()chevy.speed() 추가 할 수는 speed 기능 속도의 표준 형식을 반환해야한다; fordchevy이 다른 구체적인 유형 인 경우 을 기본 클래스에 정의 된 인터페이스를 통해 호출합니다.

+0

감사합니다. 당신은 제임스를 도웁니다. – user2709365

0

하지 마십시오. 이 당신을 위해 무엇을 찾고있는 경우

std::string& operator+(std::string& lhs, int rhs) 
{ 
    throw std::runtime_error("That's really stupid."); 
    return lhs; 
} 
+0

아니, 제 예제는 실제 프로그램의 축소 버전입니다. lhs는 int, float 또는 string이 될 수 있습니다. rhs와 동일합니다. 방금 잠재적 인 입력 유형으로 사용했습니다. – user2709365

+0

그렇다면 모든 유형의 연산자 오버로드를 작성해야합니다. 쓸데없는 물건을 만들고 싶다면 아무 것도 바꿀 수 없습니다 ^.^실제로 템플릿으로 시도 할 수 있습니다.) – Geoffroy

관련 문제