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 шт):

Автор решения: AR Hovsepyan
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 совершенно разные классы). И чтобы функция член могла создать экземпляры класса, ее определение должно быть позже определения этих классов. Чтобы что то создать, сначала нужно знать что из себя оно представляет.

→ Ссылка