исключение передается по значению - PullRequest
4 голосов
/ 06 декабря 2011

Когда я пишу свои try/catch блоки, я всегда выбрасываю объекты по значению и ловлю по ссылке. Я также применяю правило, что наиболее производные классы должны стоять на первом месте.

Сегодня я попытался поймать ПО ЗНАЧЕНИЮ, нарушая это основное правило. Код ниже выполняется без проблем и печатает "A4".

Вопрос: какой тип CCA аргумента передается в обработчик исключений, который выполняется? Исходный брошенный объект CCB передается по значению объекту CCA: это пример проблемы среза памяти или некоторого вида повреждения, т. Е. Объекту CCA нельзя полностью доверять?

Привет

AFG

  class CCA{
        int m_value;
  public:
        CCA( int value ) : m_value( value ){}            
  };

  class CCB : public CCA{
  public: 
        CCB( int value ): CCA( value ){}
  };


  main(){     
        try{
              throw CCB(4);
        }catch( CCA a ){
              std::cout << " A:" << a.value() << std::endl; 
              // this is the catch clause that executes
        }catch( CCB b ){
           std::cout << " B:" << b.value() << std::endl;
        }     
 }

Ответы [ 2 ]

3 голосов
/ 06 декабря 2011

Это нарезка : неспособность конструктора базовой копии отличить аргумент действительно того же типа от аргумента типа производного класса:

struct Base {
  Base(Base const &);  // must accept any derived class
};
1 голос
/ 06 декабря 2011

Блок захвата для исключения всегда выбирается в том порядке, в котором он представлен в коде. Так что если вы измените порядок исключений, которые вы запрограммировали, вы напечатаете B:4

В вашем коде было выбрано первое предложение catch, и конструктор копирования для базового класса передал экземпляр копии оригинала, но это будет настоящий экземпляр базового класса.

Обычное решение для обеспечения блоков перехвата в ближайшем порядке и передачи параметров по ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...