Сообщение Re[8]: Какая версия С++ ваша основная? от 13.01.2023 13:06
Изменено 13.01.2023 13:10 rg45
Re[8]: Какая версия С++ ваша основная?
Здравствуйте, rg45, Вы писали:
S>>Правильно понимаю что:
S>>
S>>..единственный способ создать объект ComplexObject это вызов createComplexObject и никак иначе? И при этом никакого копирования памяти?
R>Да, все верно.
R>Единственное, что хочется заметить, что совсем не обязательно закрывать прямо все конструкторы в классе. Вполне возможен вариант, что какой-то конструкор остается открытым и доступным, просто его использование может быть сопряжено с какими-то более-менее сложными сопуствующими операциями — вычитка дополнительных данных из базы, поиск связей с другими объектами и пр. Поэтому функция-загрузчик может предоставляться скорее в качестве помощника, берущего на себя все сопутствующие заботы, а не в качестве полицая, запрещающего прямое создание.
Чтоб приблизить пример к более практическому применению, можно вспомнить про сериализацию:
При этом подразумевается, что и сам класс MyDeserializer может в себе хранить какие-то данные, которые используются для создания объекта — например карты объектов графа для построения связей.
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 может в себе хранить какие-то данные, которые используются для создания объекта — например карты объектов графа для построения связей.
Re[8]: Какая версия С++ ваша основная?
Здравствуйте, rg45, Вы писали:
S>>Правильно понимаю что:
S>>
S>>..единственный способ создать объект ComplexObject это вызов createComplexObject и никак иначе? И при этом никакого копирования памяти?
R>Да, все верно.
R>Единственное, что хочется заметить, что совсем не обязательно закрывать прямо все конструкторы в классе. Вполне возможен вариант, что какой-то конструкор остается открытым и доступным, просто его использование может быть сопряжено с какими-то более-менее сложными сопуствующими операциями — вычитка дополнительных данных из базы, поиск связей с другими объектами и пр. Поэтому функция-загрузчик может предоставляться скорее в качестве помощника, берущего на себя все сопутствующие заботы, а не в качестве полицая, запрещающего прямое создание.
Чтоб приблизить пример к более практическому применению, можно вспомнить про сериализацию:
При этом подразумевается, что и сам класс MyDeserializer может в себе хранить какие-то данные, которые используются для создания объекта — например карты объектов графа для построения связей.
Ну и понятное дело, все эти фабрики, загрузчики, десериализаторы могут быть шаблонными в той или иной мере, мы здесь об этом не вспоминаем просто, чтоб сконцентрироваться на главном вопросе.
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 может в себе хранить какие-то данные, которые используются для создания объекта — например карты объектов графа для построения связей.
Ну и понятное дело, все эти фабрики, загрузчики, десериализаторы могут быть шаблонными в той или иной мере, мы здесь об этом не вспоминаем просто, чтоб сконцентрироваться на главном вопросе.