Структурировать базовый класс как объект исключения исключения - PullRequest
0 голосов
/ 22 апреля 2011

Интуиция говорит мне, что чем проще брошенный тип, тем лучше.Лучше бросить int, чем указатель, лучше бросить структуру, чем класс.В этом случае, однако, необходимо создать почти полный класс с динамически размещаемыми членами.Удобно выделять память в куче, потому что буферы могут стать довольно длинными, а копирование будет дорогим;ему не нужно иметь методы, потому что он действует как структура элемента управления / аргумента для других объектов, но удобно как встроить его в кучу, чтобы бросить указатель на структуру, так и иметь деструктор для очистки памяти.Чем проще, тем лучше, так должен ли деструктор быть виртуальным?Лучше ли опускать vtable или vtables не влияют на при исключении, передаваемом ?

Преимущество извлечения классов из этой структуры в качестве базового класса состоит в том, чтобы добавлять больше данных, а не к полиморфным методам.Указатель может потенциально быть пойман на несколько уровней вперед от точки исключения и передаваться между модулями, поэтому объект должен вести себя настолько чисто, насколько это возможно, и иметь как можно меньший риск возникновения ошибок.

Ответы [ 2 ]

1 голос
/ 22 апреля 2011

Виртуальный деструктор необходим только при удалении объекта через указатель на базовый класс.В случае типов исключений вы должны создавать их не динамически, а по значению.Таким образом, нет необходимости удалять их с помощью указателя базового класса или иным образом, и поэтому нет необходимости в виртуальном деструкторе.выделенные данные, о которых вы упомянули, и сравнивайте их со стоимостью генерации исключения, и вы всегда должны отдавать предпочтение утилитарности, а не эффективности, если нет явной необходимости оптимизации.Я бы порекомендовал вам извлечь все типы исключений из std::exception, чтобы вы могли единообразно обрабатывать ошибки, генерируемые как вашим кодом, так и стандартной библиотекой (и другими библиотеками).У него уже есть виртуальная функция (what(), возвращающая строку сообщения) и виртуальный деструктор.

1 голос
/ 22 апреля 2011

Посмотрите на std :: exception и наследуйте от него.

Деструктор должен быть виртуальным, только если вы ожидаете, что люди будут использовать этот класс в качестве базового класса.

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