Я пытаюсь найти способы создания класса с аргументом std :: string, но он также обрабатывает NULL без исключения. Вот пример кода:
class myString {
public:
myString(const std::string& str) : _str(str) {}
std::string _str;
};
int main() {
myString mystr(NULL);
printf("mystr = <%s>\n", mystr._str.c_str());
return 0;
}
Интуитивно, вы думаете, что эта программа должна напечатать "mystr = <>" и успешно завершиться, но вместо этого с g ++ выдает эту ошибку:
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct NULL not valid
Как я могу изменить этот класс так, чтобы он переводил NULL в "" вместо генерирования исключения logic_error?
(Постскриптум: как вы и подозреваете, «реальная» реализация немного сложнее, чем этот пример, с несколькими аргументами в конструкторе и более интересными вещами с _str - и с должным сохранением конфиденциальности. Мотивация этот пример показывает, что программисты в нашей команде будут склонны использовать NULL в этом контексте для исторических целей, и компилятор не поймает этого. Переучить каждого всегда использовать "" довольно сложно. В противном случае было бы легко найти умное решение)