Эта функция:
const char *what() const noexcept override {
return build_exception().c_str();
}
ведет к UB, когда вы возвращаете висячий указатель (вы вызываете c_str()
для временного std::string
, который уничтожается в конце выражения). Также вам не хватает кода в вашем конструкторе, который устанавливает члены file
и line
.
Я считаю, что самым простым решением было бы хранить std::string
с сообщением об ошибке внутри этого класса (и вам не нужно было бы хранить msg
, file
и line
отдельно). С другой стороны, если вы хотите просто использовать std::logic_error
для предоставления сообщения об ошибке, вы должны удалить переопределение виртуальной функции what()
:
class Exception : public std::logic_error {
static std::string build_exception( const char *msg, const char *file = "", int line = 0 ) {
std::ostringstream stream;
stream << file << ":" << line << ": " << msg << std::endl;
return stream.str();
}
public:
explicit Exception(const char *msg) std::logic_error(build_exception(msg)) {};
Exception(const char *msg, const char *file, int line) :
std::logic_error(build_exception(msg,file,line)) {}
};