Информация об изменениях

Сообщение Re[8]: Какая версия С++ ваша основная? от 13.01.2023 13:06

Изменено 13.01.2023 13:06 rg45

Re[8]: Какая версия С++ ваша основная?
Здравствуйте, 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();
}


При этом подразумевается, что и сам класс может в себе хранить какие-то данные, которые используются для создания объекта — например карты объектов графа для построения связей.
Re[8]: Какая версия С++ ваша основная?
Здравствуйте, 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 может в себе хранить какие-то данные, которые используются для создания объекта — например карты объектов графа для построения связей.