279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||
Базовый класс и идиома RAII19.07.2020, 11:53. Показов 2217. Ответов 15
Метки нет Все метки)
(
Приветствую всех. Есть базовый абстрактный класс
TAdapter , у которого два наследника: TSerialAdapter и TBluetoothAdapter . В приложении пользователь выберет какой-то один адаптер. Будет создан объект соответствующего класса и сохранится указатель на него в переменной базового класса. Классы-наследники созданы согласно идиоме RAII.Возникает вопрос: как оставить объект "живым"? Ведь при завершении функции созданный объект выйдет из области видимости и, согласно RAII, уничтожится. Примитивный пример, иллюстрирующий проблему:
0
|
19.07.2020, 11:53 | |
Ответы с готовыми решениями:
15
typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения Базовый класс Complex и производный класс для реализации квадратных матриц Описать базовый класс колоды карт и производный класс пасьянс |
6771 / 4565 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
19.07.2020, 14:00 | ||
Здесь - создавай объект динамически. И сделай у класса TAdapter виртуальный деструктор, и не забывай делать delete g_Adapter, когда это нужно.
1
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|||
19.07.2020, 14:26 [ТС] | |||
Цитирую:
TAdapter и перегрузку его оператора operator= и конструктора копии TAdapter(TAdapter&) .
0
|
"C with Classes"
|
|
19.07.2020, 14:31 | |
1
|
Неэпический
![]() |
||||||||
19.07.2020, 14:36 | ||||||||
Если объект должен переживать блок, то здесь нужна динамика.
std::shared_ptr .
1
|
"C with Classes"
|
||||||||||||
19.07.2020, 18:26 | ||||||||||||
допустим:
1
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||
19.07.2020, 18:52 [ТС] | ||||||
Наверняка, я буду не прав, если предложу следующее решение. Что если в базовом классе будет счетчик ссылок, а так же метод
Assign , который, в частности, будет увеличивать этот счетчик. Тогда, на основании значения этого счетчика, можно избежать "умирания" объекта при выходе из области видимости.Например:
0
|
"C with Classes"
|
|
19.07.2020, 19:02 | |
d7d1cd, тебе нужен внешний объект для хранения счетчика ссылок
0
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||
19.07.2020, 19:03 [ТС] | ||
serialAdapter сработает деструктор, который сначала уменьшит счетчик refcnt и посмотрит, стал ли он 0. Если он не будет равен 0, то освобождения захваченных в конструкторе ресурсов не произойдет.Хотя тогда не понятно, как эти ресурсы потом освобождать, ведь класс TAdapter о них ничего не знает...
0
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
19.07.2020, 20:22 [ТС] | |
Получается, что в моем случае не получится применить идиому RAII, то есть, захватить ресурс при создании объекта и освободить его при уничтожении. Так как создание происходит в одном месте, а удаление в другом. Верно?
0
|
6771 / 4565 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
19.07.2020, 20:28 | ||
![]() РешениеТ.е. твои объекты, TSerialAdapter и TBluetoothAdapter, должны открывать порт в конструкторе и закрывать в деструкторе, а не в отдельных методах, тогда и будет RAII. А каким образом ты будешь вызывать эти конструкторы/деструкторы, т.е. создавать/удалять объекты, это не имеет значение. Главное, чтоб не забывал удалять и не обращался к удалённым объектам.
1
|
19.07.2020, 20:28 | |
Помогаю со студенческими работами здесь
16
Класс: как обратиться к методу производного класса через итератор на базовый класс? Класс: Дописать производный класс, дополняющий базовый и содержащий минимум 2 функции-члена... Создать базовый класс Car (машина) и производный класс Lorry (грузовик): ООП ошибки
Создать иерархию классов Figure Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Опции темы | |
|
Новые блоги и статьи
![]() |
||||
Чем асинхронная логика (схемотехника) лучше тактируемой, как я думаю, что помимо энергоэффективности - ещё и безопасность.
Hrethgir 14.05.2025
Помимо огромного плюса в энергоэффективности, асинхронная логика - тотальный контроль над каждым совершённым тактом, а значит - безусловная безопасность, где безконтрольно не совершится ни одного. . .
|
Многопоточные приложения на C++
bytestream 14.05.2025
C++ всегда был языком, тесно работающим с железом, и потому особеннно эффективным для многопоточного программирования. Стандарт C++11 произвёл революцию, добавив в язык нативную поддержку потоков,. . .
|
Stack, Queue и Hashtable в C#
UnmanagedCoder 14.05.2025
Каждый опытный разработчик наверняка сталкивался с ситуацией, когда невинный на первый взгляд List<T> превращался в узкое горлышко всего приложения. Причина проста: универсальность – это прекрасно,. . .
|
Как использовать OAuth2 со Spring Security в Java
Javaican 14.05.2025
Протокол OAuth2 часто путают с механизмами аутентификации, хотя по сути это протокол авторизации. Представьте, что вместо передачи ключей от всего дома вашему другу, который пришёл полить цветы, вы. . .
|
Анализ текста на Python с NLTK и Spacy
AI_Generated 14.05.2025
NLTK, старожил в мире обработки естественного языка на Python, содержит богатейшую коллекцию алгоритмов и готовых моделей. Эта библиотека отлично подходит для образовательных целей и. . .
|
Реализация DI в PHP
Jason-Webb 13.05.2025
Когда я начинал писать свой первый крупный PHP-проект, моя архитектура напоминала запутаный клубок спагетти. Классы создавали другие классы внутри себя, зависимости жостко прописывались в коде, а о. . .
|
Обработка изображений в реальном времени на C# с OpenCV
stackOverflow 13.05.2025
Объединение библиотеки компьютерного зрения OpenCV с современным языком программирования C# создаёт симбиоз, который открывает доступ к впечатляющему набору возможностей. Ключевое преимущество этого. . .
|
POCO, ACE, Loki и другие продвинутые C++ библиотеки
NullReferenced 13.05.2025
В C++ разработки существует такое обилие библиотек, что порой кажется, будто ты заблудился в дремучем лесу. И среди этого многообразия POCO (Portable Components) – как маяк для тех, кто ищет. . .
|
Паттерны проектирования GoF на C#
UnmanagedCoder 13.05.2025
Вы наверняка сталкивались с ситуациями, когда код разрастается до неприличных размеров, а его поддержка становится настоящим испытанием. Именно в такие моменты на помощь приходят паттерны Gang of. . .
|
Создаем CLI приложение на Python с Prompt Toolkit
py-thonny 13.05.2025
Современные командные интерфейсы давно перестали быть черно-белыми текстовыми программами, которые многие помнят по старым операционным системам. CLI сегодня – это мощные, интуитивные и даже. . .
|