О том, как бросить мое исключение (экземпляр класса) - PullRequest
0 голосов
/ 28 января 2020

просмотрев этот сайт (и некоторые другие) и не найдя ответа, я в растерянности. Проблема довольно проста: я пишу класс, производный от 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.

Удаление «пустого» конструктора не помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...