2015-07-02 4 views
1

Мне нужно использовать специальный класс исключений, из которого goign будет использоваться изнутри, для функции класса верхнего уровня. Таким образом, разумно поставить пользовательский класс в качестве класса-члена. Вот файл, в котором они объявлены в настоящее время:Как мне объявить класс-член?

conductor.h:

class conductor 
{ 
    //some staff 
private: 
    class bad_index : public std::exception 
    { 
    public: 
     bad_index(int); 
     virtual const char* what() const noexcept; 
    private: 
     int _idx; 
    }; 
}; 

Я новичок в программировании на C++ и до сих пор не узнать, как C++ programmer're привык делать такие вещи? Может быть, мы должны поставить класс bad_index как незавершенный типа так:

class conductor 
{ 
    //some staff 
private: 
    class bad_index; 
}; 

и сделать его полным и выполнять все члены-функции в cpp -файла. Каков правильный путь?

ответ

1

Прежде всего, поскольку bad_index является закрытым, на него нельзя ссылаться вне класса, поэтому он не может использоваться в обработчиках исключений, кроме catch(...). Если это не нужно (то есть исключение делается только для внутреннего использования), возможно, этого недостаточно, чтобы не сделать его вложенным классом, но определить bad_index в файле реализации в namespace { ... }.

В случае, bad_index на самом деле общественность, технически вы можете объявить его в файле .h и определить в .cpp файле, но он снова будет испорчен в catch статей пользователей класса, потому что вы не можете поймать исключение неполный тип даже по ссылке, все, что вы можете сделать, чтобы поймать его снова catch(...).

+0

Итак, вы предлагаете объявить их в том же пространстве имен isntead? – user3663882

1

Если класс не является частью общедоступного интерфейса вашего класса верхнего уровня, тогда имеет смысл как можно больше вложить в него информацию о нем в заголовочный файл, а передовая декларация хорошо выполняет эту работу. Однако, если весь код, который использует это исключение, находится в одном файле cpp, вы могли бы вообще не упоминать его в заголовке и объявлять в анонимном пространстве имен внутри файла cpp.

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