Russian Qt Forum

Программирование => Общий => Тема начата: Igors от Июль 22, 2020, 13:33



Название: Оптимальное хранение члена класса
Отправлено: Igors от Июль 22, 2020, 13:33
Добрый день

Есть базовый класс с членом m_polygons
Код
C++ (Qt)
struct CBasePrimitive {
...
 Polygons * m_polygons;
...
};
Сейчас он создается в конструкторе и удаляется в деструкторе (scoped в масть, ну то мелочи). Этот класс наследуется 2 десятками др классов, для каждого порожденного класса член m_polygons создается один и тот же, т.е. вроде бы он должен быть singleton'ом каждого порожденного. Но есть 2 исключения

а) CModelPrimitive - для него m_polygons зависит от др члена - строки "name" (имя модели загружаемой с диска)

b) CDetailPrimitive - для него m_polygons зависит от др члена - int "details" (уровень деталировки)

Для этих порожденных можно сделать статик мапы, для остальных singleton'ы. Но все-таки уж очень много классов менять - нет ли более элегантного решения?

Спасибо


Название: Re: Оптимальное хранение члена класса
Отправлено: qate от Июль 22, 2020, 17:43
Замутить свой "Implicit Sharing" или взять QByteArray ?


Название: Re: Оптимальное хранение члена класса
Отправлено: Igors от Июль 23, 2020, 13:40
Замутить свой "Implicit Sharing" или взять QByteArray ?
Ну хорошо, пусть m_polygons был бы QByteArray, т.е имплисит шара для него поддерживается. И что с того ?
Код
C++ (Qt)
CDerivedPrimitive::CDerivedPrimitive( void )
{
 ..
 m_polygon = ???
 ..
}
Сейчас здесь создаются данные точно такие же как и для предыдущего экземпляра, имплисит шара сама по себе от этого дубляжа не избавляет. Вот если бы мы копировали.. (но об этом речь не идет)


Название: Re: Оптимальное хранение члена класса
Отправлено: qate от Июль 23, 2020, 19:54
имплисит шара сама по себе от этого дубляжа не избавляет

если данные точно такие же, то избавляет


Название: Re: Оптимальное хранение члена класса
Отправлено: AkonResumed от Октябрь 27, 2020, 21:41
А просто три синглтона без всяких мап, соответственно, для CBasePrimitive, CModelPrimitive, CDetailPrimitive:
Код:
Polygons* poligonsInstance()
{
static auto result = new Polygons;
return result;
}

Polygons* poligonsInstance(const QString& name)
{
static auto result = new Polygons(name);  // или как там они создаются в зависимости от name/details
return result;
}

Polygons* poligonsInstance(int details)
{
static auto result = new Polygons(details);
return result;
}
Ну или если они должны быть в области видимости классов, то делать их static protected, соответственно. Эти синглтоны (Мейерса) инициализируются при первом обращении, thread-safe. Если указатель не может принимать нулевого значения по смыслу, то я использую во всех таких случаях ссылку. Т.е.:
Polygons& poligonsInstance(int details)