Re[8]: Какая версия С++ ваша основная?
От: rg45 СССР  
Дата: 13.01.23 13:06
Оценка: +1
Здравствуйте, rg45, Вы писали:

S>>Правильно понимаю что:

S>>
S>>class ComplexObject {
S>>    ComplexObject(int) {}
S>>    friend ComplexObject createComplexObject();
    
S>>    ComplexObject() = delete;
S>>    ComplexObject(ComplexObject&&) = delete;
S>>    ComplexObject(const ComplexObject&) = delete;
S>>};

S>>ComplexObject createComplexObject()
S>>{
S>>    return ComplexObject(0);
S>>}
S>>


S>>..единственный способ создать объект ComplexObject это вызов createComplexObject и никак иначе? И при этом никакого копирования памяти?


R>Да, все верно.


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


Чтоб приблизить пример к более практическому применению, можно вспомнить про сериализацию:

class MyDeserializer
{
public:

  ComplexObject DeserializeComplexObject();
}


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

Ну и понятное дело, все эти фабрики, загрузчики, десериализаторы могут быть шаблонными в той или иной мере, мы здесь об этом не вспоминаем просто, чтоб сконцентрироваться на главном вопросе.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 13.01.2023 13:12 rg45 . Предыдущая версия . Еще …
Отредактировано 13.01.2023 13:10 rg45 . Предыдущая версия .
Отредактировано 13.01.2023 13:06 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.