просмотрев этот сайт (и некоторые другие) и не найдя ответа, я в растерянности. Проблема довольно проста: я пишу класс, производный от std :: exception, и пытаюсь создать экземпляр этого класса. Но компилятор мне этого не разрешит.
Для заголовка я позаимствовал несколько строк из runtime_error:
class StdException : public std::exception
{
public:
StdException () {}
explicit StdException (const StdException&);
explicit StdException (const std::string&);
explicit StdException (const char*);
~StdException() override { if(what_ptr) delete[] what_ptr; }
const char* what() const noexcept override;
StdException& operator= (const StdException&);
private:
char* what_ptr;
};
Код в файле. cpp тоже невелик:
[snip]
StdException::StdException (const std::string& what_arg)
{
size_t l = what_arg.size();
what_ptr = new char[l+1];
memset(what_ptr, '\0', l+1);
strcpy(what_ptr, what_arg.c_str());
}
StdException::StdException (const char* what_arg)
{
[the same in green]
}
[...]
Забавная часть начинается, когда я пытаюсь бросить такую вещь:
[[noreturn]] void throw_something () {
throw new StdException{"Foobar"};
}
Только с этим распределением кучи компилятор пропустит это. Но это, так что я прочитал несколько раз и понял, это плохая идея. Без, просто
throw StdException{"Foobar"};
или
StdException e{"Foobar"};
throw e;
Я получаю не соответствующий конструктор ... жалоба от компилятора.
Как я сказал, что я новичок в C ++. Мои извинения, если это все банально.
Вот полный код:
"include / execption.h":
#ifndef EXCEPTION_H
#define EXCEPTION_H
#include <exception>
#include <string>
#include <cstring>
class StdException : public std::exception
{
public:
StdException () {}
explicit StdException (const StdException&);
explicit StdException (const std::string&);
explicit StdException (const char*);
~StdException() override { if(what_ptr) delete[] what_ptr; }
const char* what() const noexcept override;
StdException& operator= (const StdException&);
private:
char* what_ptr;
};
исключение. cpp:
#include "include/exception.h"
StdException::StdException (const StdException& e)
{
size_t l = strlen(e.what_ptr);
what_ptr = new char[l+1];
memset(what_ptr, '\0', l+1);
strcpy(what_ptr, e.what_ptr);
}
StdException::StdException (const std::string& what_arg)
{
size_t l = what_arg.size();
what_ptr = new char[l+1];
memset(what_ptr, '\0', l+1);
strcpy(what_ptr, what_arg.c_str());
}
StdException::StdException (const char* what_arg)
{
size_t l = strlen(what_arg);
what_ptr = new char[l+1];
memset(what_ptr, '\0', l+1);
strcpy(what_ptr, what_arg);
}
StdException& StdException::operator= (const StdException& e)
{
size_t l = strlen(e.what_ptr);
what_ptr = new char[l+1];
memset(what_ptr, '\0', l+1);
strcpy(what_ptr, e.what_ptr);
return *this;
}
const char* StdException::what() const noexcept
{
return what_ptr;
}
И ошибка:
нет подходящего конструктора для инициализации 'StdException' exception.h: 11: 5 note: Кандидат-конструктор недопустим: требует 0 аргументов, но был предоставлен 1.
Удаление «пустого» конструктора не помогло.