Я довольно новичок во многих современных концепциях C ++ / OOP, и у меня есть вопрос о дизайне RAII.
Рассмотрим класс, который управляет и взаимодействует с переходным ресурсом: соединение через сокет TCP, соединение с устройством Bluetooth и связь с указанными устройствами. Вещи как это. Мы можем предположить, что класс полностью бесполезен, если ресурс недоступен или становится недоступным.
Я не могу решить, является ли RAII (в частности, получение / подключение к ресурсу в ctor) хорошим или плохим для этого типа класса.
С одной стороны, если функциональность класса зависит от ресурса, кажется, имеет смысл выбросить из ctor, а не при более позднем вызове Connect (). С другой стороны, получение переходного ресурса обычно включает в себя некоторую блокировку и / или асинхронную операцию, что для меня похоже на плохой дизайн конструктора.
Я нашел несколько других тем, которые танцуют вокруг этого вопроса, но не полностью удовлетворили мое любопытство:
RAII, сокеты Беркли и контейнеры STL
RAII для ресурсов, которые могут быть признаны недействительными
Будем благодарны за любые рекомендации по передовому опыту!
РЕДАКТИРОВАТЬ: Уточнение моего вопроса на основе комментариев ниже. С частью RAII, которая имеет дело с конструкторами, устанавливающими все инварианты класса - соединение с устройством является инвариантом, потому что класс должен гарантировать, что все открытые методы, которые пытаются связаться с этим устройством, действительны после построения. ОДНАКО - действительно ли это можно считать инвариантом класса, поскольку программа не контролирует доступность удаленного устройства?