Я создаю класс, у которого есть конструктор, инициализированный из const char*
, который должен безопасно построить объект, используя данные, предоставленные в буфере, который должен содержать строку. Мои заботы состоят в том, что пользователь может использовать этот конструктор с неправильными данными, например. NULL
указатель или указатель на выделенную память или что-то в этом роде. Дело в том, что в этом случае я хочу закончить создание объекта (который будет находиться в неопределенном, но правильном состоянии), не вызывая segfault, если, например, пользователь отправил мне указатель на данные, которые я не должен читать. Я думал послать все проверки ввода в std::string
конструктора, так что конструктор будет выглядеть следующим образом:C++ - создание безопасного const char * contructor
Foo(const char *s) : Foo(std::string(s)) {}
Но мой учитель назвал это «ложная идея». Итак, каков надлежащий способ справиться с этой ситуацией?
Еще одна вещь, я не могу использовать исключения в этом случае (это часть моего домашнего задания в курсе, который еще не научил его).
Вам это не нужно - компилятор достаточно умен, чтобы понять, как использовать конструктор 'foo (std :: string)'. –
На самом деле - мне это нужно. Мне нужно, чтобы конструктор 'foo (std :: string)' был 'explicit', чтобы предотвратить что-то вроде' foo x = "bar" '. – qiubit
«неопределенное, но правильное состояние» кажется противоречием в терминах. На самом деле, вместо создания неопределенного объекта вы должны * почти наверняка * генерировать исключение в конструкторе, чтобы предотвратить создание неисправного объекта. Конечно, это зависит от практического варианта, но это часто правильное решение, которое я бы назвал абсолютным законом. –