error: cannot catch reference to incomplete type
вот имеется подобный хедер:
class A
{
public:
...
class MyException1;
class MyException2;
...
private:
int a;
void check_condition() const;
};
class MyException2: public std::exception
{
public:
const char* what() const throw();
};
class MyException1: public std::exception
{
public:
const char* what() const throw();
};
суть в том, что есть два класса, которые вложены в основной. эти классы наследуются от класса исключений.
в классе А имеется функция check_condition, которая, проверяя условия, бросает один из MyException. и если по логике кажется правильным, по факту этот код не компилируется и бросает ошибку. указывая на строчку из cpp с блоками catch. если ловлю просто ссылку на std::exception, то все нормально компилируется и работает, но в таком случае надо повторно проверять условия для соответствия одному из исключений, а если подставить MyException - уже ругается. оч хочется разделить обработку ошибок без внутренних проверок условия, но не понимаю как.
хочу, чтоб работало примерно так:
try { check_condition(); }
catch(A::MyExcetion1& e) {...;}
catch(A::MyException2& e) {...;}
функция check_condition() имеет условно следующую реализацию:
void A::check_condition()
{
if (this->a < 1)
throw A::MyException1();
if (this->a > 1000)
throw A::MyExceprion2();
}
функция check_condition() используется в конструкторе класса А(int a) и в функциях типа setA(int a) incrementA() decrementA().
Ответы (1 шт):
class A
{
int a{};
public:
//...
class MyException1;
class MyException2;
// ...
void check_condition() const;
};
class A::MyException2 : public std::exception
{
public:
const char* what() const throw()
{ return "error2"; }
};
class A::MyException1 : public std::exception
{
public:
const char* what() const throw()
{ return "error1"; }
};
void A::check_condition() const
{
if (a < 1)
throw MyException1();
if (a > 1000)
throw MyException2();
}
int main()
{
A a;
try { a.check_condition(); }
catch (A::MyException1 & e)
{ e.what(); /*...*/ }
catch (A::MyException2 & e)
{ e.what(); /*...*/ }
return 0;
}
Проблема в том, что вы определяете классы, никак не связанные с классом А (class A::MyException1 и class MyException1 совершенно разные классы). И чтобы функция член могла создать экземпляры класса, ее определение должно быть позже определения этих классов. Чтобы что то создать, сначала нужно знать что из себя оно представляет.