2013-10-11 3 views
0

Я новичок в C++ и изучаю, как обрабатывать исключения. Я хочу, чтобы программа выдавала исключение, если я пытаюсь добавить две переменные разных типов. Когда я скомпилирую, я получаю ошибку несоответствия, и сообщение, которое + не будет работать с этими двумя типами, но я хочу, чтобы оно вместо этого выбрало исключение.Как выбросить исключение из-за несоответствия данных

#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

«Когда я компилирую, я получаю ошибку несоответствия ... но я хочу, чтобы это исключало исключение» - ** why **? Это не имеет никакого смысла. Это * хорошая вещь, что это ошибка компиляции, а не исключение во время выполнения. –

+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); 
    } 

В каждом из производных классов, вы static_castBase const& к Derived const&, а затем делать все, что должно быть сделано.

Если вы хотите обрабатывать смешанные типы, вам потребуется форма обратной связи .

Вы также указали реализацию «сложения», где типы, которые должны быть добавлены , отличаются. Проблема в том, что добавление имеет тип возврата, который зависит от добавляемых типов. Обычный способ управления этим - это решить канонический тип (например, double). В этом случае лучшим решением является, возможно, предоставление своего рода виртуальной функции, которая возвращает значение как канонический тип , добавляет ли канонический тип и вернет его.

Тем не менее, это очень плохой дизайн. Во-первых, из , конечно, вы не «добавляете» ford и chevy и рассчитываете получить сумму их скорости . Это просто не имеет смысла. Вы можете добавить ford.speed() и chevy.speed() (хотя я не думаю, что добавление скорости два неродственных автомобилей имеет смысл либо), но независимо от реализаций speed функции должна возвращать канонический тип скорости; , еслиford и chevy имеют разные типы бетона, вы будете звонить через интерфейс, определенный в базовом классе.

+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

Смежные вопросы