Форум программистов, компьютерный форум, киберфорум
Теория программирования
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,042
Записей в блоге: 2

Член указатель

09.07.2024, 23:01. Показов 3784. Ответов 52
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день

Очень простая конструкция
C++
1
2
3
4
5
struct SomeObject {
...
 SomeData * m_data;
...
};
Как минимум возникают заботы с сохранностью/валидностью m_data, но не только
Как лучше? Слышал такое

1) "Лучше иметь m_data членом, а не указателем". Это владение, а оно не всегда нужно/допустимо. В большинстве случаев SomeObject просто использует SomeData для чтения/записи, но SomeData остается вполне самостоятельным объектом что может существовать и без SomeObject

2) "Необходимо использовать вумный указатель! Вообще "голые" указатели (как в примере выше) - это зло, их быть вообще не должно!"

А Вы что предложите?

Спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.07.2024, 23:01
Ответы с готовыми решениями:

Функция-член принимает указатель на функцию-член
Задача состоит в следующем. Нужно реализовать функцию-член которая принимает указатель функцию-член из класса. Но встретился с такой...

Не могу создать указатель на функцию. ошибка: нестандартный синтаксис; используйте "&", чтобы создать указатель на член
Выбивает ошибку, когда хочу присвоить переменной адрес какой то функции. Ошибка в строке 28(если убрать комментарии: 30-33) class...

Указатель на функцию-член
// howmany.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <iostream> #include...

52
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,042
Записей в блоге: 2
13.07.2024, 19:25  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Алексей1153 Посмотреть сообщение
либо запретить удаление, если на объект есть ссылка, либо Light2 будет использовать дефолты
Цитата Сообщение от zayats80888 Посмотреть сообщение
Архитектурно напрашивается, что параметры это ресурс, т.е. подсчет ссылок актуален.
В любом случае Light1 должен знать что на него есть ссылка(и), причем только факт/число ссылок явно недостаточно - "запрет удаления" вряд ли устроит.
Цитата Сообщение от zayats80888 Посмотреть сообщение
А каким боком вы сюда undo приплели?
Почему "приплел"? Удаляется элемент/объект сцены, обеспечить undo обязан. Да, факт/действие установки ссылки конечно был, но
С Ларисой я действительно пил вино, но это было на пасху
Очевидно просто так "хранить указатель" нехорошо, нужно расширять структуры данных. Каким образом?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
13.07.2024, 19:48
Цитата Сообщение от Igor3D Посмотреть сообщение
В любом случае Light1 должен знать что на него есть ссылка(и), причем только факт/число ссылок явно недостаточно - "запрет удаления" вряд ли устроит.
Ничего не понял... Короче, давайте выясним, зачем вы сделали "параметры" указателем и зачем другой объект ссылается на те же параметры.
Я вижу только две причины - комплексное редактирование и снижение зтарат памяти (например, снижение траффика данных на gpu).
Ответьте на пару вопросов:
1) кто владеет "параметрами"? (очевидно владение разделяемое, т.е. подсчет ссылок актуален)
2) что происходит при редактировании "параметров" и через что они редактируются? (очевидно они меняются для всех владельцев, если нужно независимо, то редактор должен предоставлять возможность сделать ресурс уникальным, т.е. редактируется ресурс, а не владелец)
3) зачем одному объекту знать, кто и сколько еще используют тот же ресурс? (я не вижу в этом смысла, т.е. даже количество ссылок самому объекту знать не нужно)
Цитата Сообщение от Igor3D Посмотреть сообщение
Почему "приплел"? Удаляется элемент/объект сцены, обеспечить undo обязан.
Эм... обеспечить восстановление удаленного объекта? Не вижу проблемы и не вижу как с этим связан "член указатель".
На всякий случай напомню, что undo - это отмена последнего действия, т.е. удалить Light1 через undo не затрагивая Light2 нельзя, грубо говоря, отменяться будут все действия, выполненные после создания Light1.
Цитата Сообщение от Igor3D Посмотреть сообщение
Очевидно просто так "хранить указатель" нехорошо, нужно расширять структуры данных. Каким образом?
Я не знаю, что вам там очевидно, вы пока ни одного обоснования, что хранить голый указатель "нехорошо" не привели, только никак не связанные и с потолка взятые "примеры" без деталей (поэтому я и говорю - высосано из пальца).
0
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,042
Записей в блоге: 2
13.07.2024, 22:32  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Ничего не понял... Короче, давайте выясним, зачем вы сделали "параметры" указателем и зачем другой объект ссылается на те же параметры.
Я вижу только две причины - комплексное редактирование и снижение зтарат памяти (например, снижение траффика данных на gpu).
Ответьте на пару вопросов:
1) кто владеет "параметрами"? (очевидно владение разделяемое, т.е. подсчет ссылок актуален)
2) что происходит при редактировании "параметров" и через что они редактируются? (очевидно они меняются для всех владельцев, если нужно независимо, то редактор должен предоставлять возможность сделать ресурс уникальным, т.е. редактируется ресурс, а не владелец)
Тут все просто. Те же источники света. Нормально, по умолчанию это объекты одного типа, они предъявляются в UI, юзер открывает окно и меняет параметры конкретного лайта, напр цвет/интенсивность. Никаких шаред, ничего, параметрами владеет объект "источник света", они просто его члены. Теперь юзер установил отношение master/slave. Никакие данные не меняются, но slave использует параметры (напр тот же цвет) мастера, напр при отрисовке сцены. Резоны очевидны - редактируем один объект вместо каждого из многих. Если юзер разорвал зависимость - используются собственные параметры.

Если такой пример не нравится - можно другой. Хотя бы скины. Полигонный объект управляется бонами, но никакими другими отношениями/владениями они не связаны. И опять-таки нельзя просто так, безболезненно удалить бону.
Цитата Сообщение от zayats80888 Посмотреть сообщение
На всякий случай напомню, что undo - это отмена последнего действия, т.е. удалить Light1 через undo не затрагивая Light2 нельзя, грубо говоря, отменяться будут все действия, выполненные после создания Light1.
Та ну.. В лучшем случае - undo для текущей сессии (от момента старта приложения). А то и меньше. Вот Вы работаете в каком-то IDE/редакторе текста. Он умеет undo для того что Вы набирали/редактировали вчера? Наверно только если не выключали машину и не выходили из приложения
0
фрилансер
 Аватар для Алексей1153
6482 / 5708 / 1132
Регистрация: 11.10.2019
Сообщений: 15,222
13.07.2024, 22:37
Цитата Сообщение от Igor3D Посмотреть сообщение
Наверно только если не выключали машину и не выходили из приложения
никто не мешает сохранять журнал событий вместе с проектом. Но обычно это не делается
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
13.07.2024, 22:40
Цитата Сообщение от Igor3D Посмотреть сообщение
Теперь юзер установил отношение master/slave. Никакие данные не меняются, но slave использует параметры (напр тот же цвет) мастера, напр при отрисовке сцены.
Это где это вы такое видели для источников света? Ну и покажите, как это реализовано в коде.
Цитата Сообщение от Igor3D Посмотреть сообщение
Если такой пример не нравится - можно другой.
Вы мне лучше премер реально решаемой вами задачи приведите, чтоб разговор предметный был, а не "высасывайте из пальца".
Цитата Сообщение от Igor3D Посмотреть сообщение
Полигонный объект управляется бонами, но никакими другими отношениями/владениями они не связаны. И опять-таки нельзя просто так, безболезненно удалить бону.
Это какие-то байки, код приведите.
Цитата Сообщение от Igor3D Посмотреть сообщение
В лучшем случае - undo для текущей сессии (от момента старта приложения). А то и меньше.
Так об этом и речь (кстати, после перзапуска в востановленной сессии могут сохраняться команды и кое-где это реализовано).
Вот я и спрашиваю, к чему вы упоминаете undo и с чем у вас там проблемы?
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,890
14.07.2024, 01:02
Цитата Сообщение от Igor3D Посмотреть сообщение
Тот же тест/пример: undo. Как "восстановить переписку"?
Все действия - через Команды. Хранить список Команд.
0
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,042
Записей в блоге: 2
14.07.2024, 01:36  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Это где это вы такое видели для источников света? Ну и покажите, как это реализовано в коде.
Это выглядит так
C++
1
2
3
4
5
6
7
8
9
10
11
struct Light {
 float m_intensity;
 ...
 Light * masterLight;
 ...
};
 
float Light::GetIntensity( void ) const
{
 return masterLight ? masterLight->GetIntensity() : m_intensity;
}
Подобных/аналогичных ситуаций, когда один объект использует/ссылается на другой, в моем проекте больше 20, точно не помню.
Цитата Сообщение от zayats80888 Посмотреть сообщение
Вот я и спрашиваю, к чему вы упоминаете undo и с чем у вас там проблемы?
К тому что возникает необходимость знать какие объекты ссылаются на данный, отвертеться не удается.

Добавлено через 2 минуты
Цитата Сообщение от Shamil1 Посмотреть сообщение
Все действия - через Команды. Хранить список Команд
Он может быть неприемлемо велик
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
14.07.2024, 02:31
Цитата Сообщение от Igor3D Посмотреть сообщение
Это выглядит так
Т.е. я правильно понимаю, у вас там параметры не одной intensity ограничиваются и помимо естественной древовидной иерархии сцены parent/child вы еще добавили "горизонтальные/диагональные" связи master/slave, причем master не знает о своем slave?
Цитата Сообщение от Igor3D Посмотреть сообщение
Подобных/аналогичных ситуаций, когда один объект использует/ссылается на другой, в моем проекте больше 20, точно не помню.
Интересное архитектурное решение... Но давайте остановимся только на Light - обоснуйте такое архитектурное решение для него и его плюсы.
Я навскидку могу только назвать очевидные минусы:
1) с "собственными" параметрами у света композиция, а с "чужими" - агрегация, и это взаимоисключающе, т.е. либо одно, либо другое висит в объекте мертвым грузом.
2) дополнительные связи (да и еще односторонние) усложняют код, его понимание и изменение.
3) оптимизацию отправки этих данных на рендер я не вижу
4) общие параметры для, скажем, 10 источников - это односвязный список от slave к master и рекурсивный вызов GetIntensity?
5) не понятно, как организовано условное SetIntensity, slave редактирует данные master без его ведома? ("Что этот ни*ер себе позволяет?"© )
Я вам сразу предложил параметры как разделяемый ресурс(Алексей1153 еще раньше) - нивелирует все вышеупомянутые минусы и снимает вопрос в заголовке темы.

Цитата Сообщение от Igor3D Посмотреть сообщение
К тому что возникает необходимость знать какие объекты ссылаются на данный, отвертеться не удается.
А зачем вы такие связи построили? Сами себе проблему создали и теперь "отвертеться" хотите.

Цитата Сообщение от Igor3D Посмотреть сообщение
Он может быть неприемлемо велик
Он может быть ограничен как по количеству команд, так и по объему занимаемой памяти. Интерфейс стека над циклическим буфером.

Добавлено через 11 минут
...
1
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,042
Записей в блоге: 2
14.07.2024, 15:31  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Интересное архитектурное решение... Но давайте остановимся только на Light - обоснуйте такое архитектурное решение для него и его плюсы.
Давайте Хотя это и мимо темы - вместо обсуждения как сделать - обсуждается зачем (нужно ли) это делать. Но такие оффтопы всегда были и будут, иногда они полезны

1) Хотя "указатель на другой объект" используется довольно часто, но само использование уникально. Не могу припомнить ни одной такой же зависимости как "master light". Ну может "master material" как-то похож, но немного

2) Ничего я не придумывал, эта фича досталась мне по наследству. Никакого недовольства (ни моего ни юзера) она не вызывает. Да, есть мелкие проблемки, но рулить толпой лайтов актуально и удобно.

3) Детали. Там есть еще контрол
C++
1
2
3
4
5
float Light::GetIntensity( void ) const
{
 bool useMaster = masterLight && GetFlag(LIGHT_INHERIT_INTENSITY);
 return useMaster ? masterLight->GetIntensity() : m_intensity;
}
Не очень понял о какой рекурсии Вы говорите. Строить "иерархию лайтов" не запрещено, но нужды в ней не видно, одного уровня обычно достаточно. И конечно slave не меняет установки мастера - юзер должен открыть окно мастера и там редактировать. Конечно необходима поддержка UI (разные иконки для slave/master, показать что параметр ведомый, найти мастера или наоборот, всех slave и.т.п.), но никаких принципиальных трудностей нет.

Цитата Сообщение от zayats80888 Посмотреть сообщение
Я вам сразу предложил параметры как разделяемый ресурс(Алексей1153 еще раньше) - нивелирует все вышеупомянутые минусы и снимает вопрос в заголовке темы.
Если это вумный указатель, то он решает только валидность указателя, да и то ценой навязывания shared_ptr

Цитата Сообщение от zayats80888 Посмотреть сообщение
Он может быть ограничен как по количеству команд, так и по объему занимаемой памяти. Интерфейс стека над циклическим буфером.
Здесь я не понял, на всякий случай спрошу. Юзер работает с проектом длительное время. Год назад он создал лайт. Полгода назад сделал его мастером. Сегодня решил это лайт удалить. И что, undo должен помнить/хранить "от момента создания"? Или как?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
14.07.2024, 16:50
Цитата Сообщение от Igor3D Посмотреть сообщение
Хотя это и мимо темы
Не мимо, а в точку. Ошибка архитектуры и поставила перед вами вопрос темы. Вместо исправления этой ошибки вы хотите вставлять костыли.
Цитата Сообщение от Igor3D Посмотреть сообщение
1)
Не вижу тут ни обоснования, ни плюсов. Я надеюсь "само использование уникально" это не оно
Цитата Сообщение от Igor3D Посмотреть сообщение
2)
Ок, наследство приемлемое обоснование. А вот про "рулить толпой лайтов удобно" не понял. Насколько я понял, рулите вы параметрами, а зависимости между лайтами прямые. Как раз не "удобно" и проблемки не "мелкие".
Цитата Сообщение от Igor3D Посмотреть сообщение
Если это вумный указатель, то он решает только валидность указателя, да и то ценой навязывания shared_ptr
Я говорил только про подсчет ссылок, (валидность и shared_ptr опциональны):
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Например:
 
class RefCounted {
  // ref, unref
};
 
class Resource : public RefCounted {
  // make_unique/clone, ResourceManger::get_by_id, ...
};
 
class LightParams : public Resource {
  Type a, b, c;
  // set_value_.../get_value_...
};
 
class Light : public Object {
  LightParams *m_params;
  ...
};

И нет никаких master/slave, управление параметрами - это управление параметрами а не зависимостями.

Короче, кроме наследия я обоснований не увидел (а плюсов вообще нет).
Констатируем кривой дизайн и вытекающие из этого проблемы - лечится (если это возможно) "выпрямлением" дизайна, а не костылями.

Цитата Сообщение от Igor3D Посмотреть сообщение
Год назад он создал лайт. Полгода назад сделал его мастером. Сегодня решил это лайт удалить. И что, undo должен помнить/хранить "от момента создания"?
Нет, undo как раз вероятно не сможет отменить действие полугодовалой давности (хотя ключевое тут не время, а количество выполненных команд, так-то и за полчаса работы можно потерять команды, с которых начинали).
Только не понимаю, как этот ваш вопрос связан с процитированным вами.

З.Ы. Ну и честно говоря, я не вижу смыла для лайтов использовать даже подход с разделяемыми ресурсами, если речь идет о том, чтоб удобно было "рулить группами" в редакторе. Лайтов как правило не много и параметры не "тяжелые" объекты (разве что текстура с проекционным изображением, но её можно и нужно в ресурсы определять). В редакторе групповое редактирование параметров удобнее сделать через паттерн "прототип" или добавить отдельную сущность группы/группового выделения.

Добавлено через 20 минут
Ну а если вы не намерены исправлять дизайн, то, как уже было упомянуто в этой теме, вам нужно для slave объектов организовать подписку на событие удаление master объекта из сцены, в том или ином виде (зависит от того, как у вас там вообще взаимодействие между объектами организованно). А для реализации undo/redo в обработчике такого события сериализовать команду "расцепления" каждого slave с master (идентификацию объектов при сериализации/десериализации удобно делать через глобальный id, а не через указатель, если вы не управляете менеджером памяти).
1
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,042
Записей в блоге: 2
14.07.2024, 18:07  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Не мимо, а в точку. Ошибка архитектуры и поставила перед вами вопрос темы. Вместо исправления этой ошибки вы хотите вставлять костыли.
Думаю что никому еще не удавалось так быстро/бегло решать вопросы архитектуры Это вещь на порядок(ки) более сложная чем изложена в стартовом посте. Даже вопросы типа "а как/где это юзается в проекте?" могут потребовать много дней - даже при том что я (пусть не один) много работал с проектом. Что несравнимо затратнее чем начальная задача. Нужно относиться спокойнее/лояльнее и в дебри не лезть. В данном случае.

- что он (я) хочет? Знать какие объекты ссылаются на данный. Это разумный запрос/задача? Безусловно, во всяком случае не полный идиотизм. В каком-то случае можно этой задачи избежать? Может и можно, но стоит ли? Это минимум спорно. Ну и давайте эту задачу решать, не все здесь великие архитекторы
Цитата Сообщение от zayats80888 Посмотреть сообщение
А для реализации undo/redo в обработчике такого события сериализовать команду "расцепления" каждого slave с master
Я об этом и говорю. Но тогда мастер должен знать своих slaves. Как это сделать? Кстати как это решается сейчас (никто не спросил). Тупо, в лоб, просматриваются ВСЕ объекты SomeObjet. Это работает и скорость не такая уж проблема (ну не мульены объектов в сцене), но это коряво. Как лучше?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
14.07.2024, 18:43
Цитата Сообщение от Igor3D Посмотреть сообщение
Думаю что никому еще не удавалось так быстро/бегло решать вопросы архитектуры
Быстро сделать "хорошо" трудно, а бысто понять, что "плохо" легче. Ну а на форуме такие вопросы вообще не решаются.
Я исхожу только из тредоставленной вами ограниченной информации, которую еще и клещами вытаскивать приходится.
Цитата Сообщение от Igor3D Посмотреть сообщение
Но тогда мастер должен знать своих slaves.
Не знаю, должен ли. Вот вы с Qt знакомы, скажите, соединение сигнал Object::aboutToBeDestroyed() - слот Light::onMasterDestroyed() это разве можно назвать "знанием о slaves"? Нет.
Цитата Сообщение от Igor3D Посмотреть сообщение
Кстати как это решается сейчас (никто не спросил).
Простите, мы виноваты, master
0
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,042
Записей в блоге: 2
14.07.2024, 20:44  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
которую еще и клещами вытаскивать приходится.
Не то чтобы "я скрываю/утаиваю", но "вдаваться в подробности" совершенно ни к чему. Всякий может рассказывать часами о своем проекте, я не исключение. Ну нагружу (перегружу) я Вас инфой, что с того? В конце-концов вникать в чужую работу никто не обязан. Вопросы/любопытство иссякают, а обсуждение остается бесплодным и глохнет.

Цитата Сообщение от zayats80888 Посмотреть сообщение
Не знаю, должен ли. Вот вы с Qt знакомы, скажите, соединение сигнал Object::aboutToBeDestroyed() - слот Light::onMasterDestroyed() это разве можно назвать "знанием о slaves"? Нет.
Нет, мастер по-прежнему "не в курсе". Но это соединение решает лишь зачистку невалидного указателя при удалении. Маловато будет.

Меня удивляет почему не предлагается самое простое (очевидное, напрашивающееся и.т.п.) решение? Кстати недавно создавал тему "куда ставить ногу" - то же самое. Неужели никто его не видит? Не может такого быть! Или все уже заранее знают что оно плохо? (я нет). Объясните этот эффект
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
14.07.2024, 21:14
Цитата Сообщение от Igor3D Посмотреть сообщение
Маловато будет.
А что еще надо? Или эта информация из категории
Цитата Сообщение от Igor3D Посмотреть сообщение
"вдаваться в подробности" совершенно ни к чему
?
Ну добавьте еще указатель на функцию форматирования диска, "маловато" не покажется

Цитата Сообщение от Igor3D Посмотреть сообщение
Меня удивляет почему не предлагается самое простое (очевидное, напрашивающееся и.т.п.) решение?
Решение какой проблемы? Самые очевидные и простые решения проблемы в стартовом посте уже предложили.
А для меня лучшее решение проблемы - не создавать проблему вообще.
0
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,042
Записей в блоге: 2
14.07.2024, 21:41  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Решение какой проблемы? Самые очевидные и простые решения проблемы в стартовом посте уже предложили.
Ну хорошо, а почему не так?
C++
1
2
3
4
5
struct SomeData {
...
 std::vector<SomeObject *> m_clients;
...
};
Хотели знать кто ссылается - ну давайте просто хранить/отслеживать их. Разве это так плохо что не достойно даже упоминания?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
14.07.2024, 21:54
Цитата Сообщение от Igor3D Посмотреть сообщение
Разве это так плохо что не достойно даже упоминания?
Т.е. мы добавляем еще мертвый груз к объекту (slaves его использовать не будут).
Появляется новая проблема отслеживания валидности уже этих указателей.
Т.е. ради всего одной сомнительной фичи "группового руления лайтами" мы параллельно одной иерархии parent/child поддерживаем еще одну кривую(почти полноценную) иерархию master/slave с непонятными взаимоотношениями.
Да, это плохо и не достойно упоминания. Лучше вообще избавится от этих взаимосвязей в реализации объектов.
Если нужно, делайте опосредованно (через общий ресурс) или "над" объкетами.

И, кстати, вам этот вариант предлагали(не напрямую в коде, а через "подписаться на событие", ну и посмотрите типичную реализацию паттерна "наблюдатель"). И если у вас в проекте до сих пор нет механизма взаимодействия между объектами, то в обобщенном виде такую реализацию можно и прикрутить.

Добавлено через 2 минуты
З.Ы. Ну и что там по поводу "маловато"? Будете и дальше "скрывать" чего вам не хватает?
0
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,042
Записей в блоге: 2
15.07.2024, 04:46  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
З.Ы. Ну и что там по поводу "маловато"? Будете и дальше "скрывать" чего вам не хватает?
Если есть контейнер тех кто ссылается на объект - всего хватает
C++
1
2
3
4
5
6
7
8
void Write2Undo( UndoStream & stream, Light * theLight )
{
 ...
 stream.WriteCount(theLight->SlaveCount());
 for (auto * slave : theLight->m_slaves)
   stream.WriteID(slave->GetUniqueID()); 
 ...
}
C++
1
2
3
4
5
6
7
8
9
10
Light::~Light( void )
{ 
 ...
 for (auto * slave : m_slaves)
   slave->SetMaster(nullptr); 
 
 if (masterLight)
  masterLight->RemoveSlave(this);
  ...
}
Не вижу как достичь того же сигналами

Цитата Сообщение от zayats80888 Посмотреть сообщение
делайте опосредованно (через общий ресурс)
А как это?
Цитата Сообщение от zayats80888 Посмотреть сообщение
И если у вас в проекте до сих пор нет механизма взаимодействия между
объектами
Наверное до сих пор нет, т.к. не знаю что за механизм имеется ввиду. Не навязываю своего мнения, но я считаю это "зависимостями" (а не взаимодействиями)
Цитата Сообщение от zayats80888 Посмотреть сообщение
мы параллельно одной иерархии parent/child поддерживаем еще одну кривую(почти полноценную) иерархию master/slave
Не только, там еще с пяток иерархических зависимостей. И что в этом плохого?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.07.2024, 08:52
Igor3D,
Не вижу как достичь того же сигналами
Не вижу ничего сложного. В любом случае, это не относится к теме и вам надо надо пойти в соответствующий раздел, создать тему по всем правилам, приложить код и спросить "научите сделать то-то".
А как это?
Пьем таблетки от деменции и перечитываем тему, повторяться я смысла не вижу.
Наверное до сих пор нет, т.к. не знаю что за механизм имеется ввиду.
Ну вы же наверняка на qt пишете, там уже все есть, очень мощная и гибкая реализация паттерна наблюдатель в виде сигналов/слотов.
Не только, там еще с пяток иерархических зависимостей. И что в этом плохого?
В иерархиях нет ничего плохого. Плохо то, что вы зашиваете не базовый функционал в реализацию обьекта. Я вам так объясню: например, вы хотите выбирать в редакторе группу объектов и мышкой двигать все вместе, и реализуете это через назначение на время выполнения одной операции одного главного объекта и всех остальных подчинёнными, следующими за главным. И делаете это вот так, как вы делаете - добавлением данных-указателей и логики, которая не имеет отношения к назначению объекта, а призвана решать задачи уровня сцены/проекта/редактора. При том, что у вас уже есть инструменты и механизмы, позволяющие это реализовать не через ж*пу. Если для вас это нормально, то и на здоровье.

Не по теме:

Лишний раз убеждаюсь, что это очередная ваша тема пофлудить.

0
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,042
Записей в блоге: 2
15.07.2024, 19:34  [ТС]
Заметим что есть и др подход
C++
1
2
3
4
5
6
// using TUniqueID = uint32;
struct Light {
..
 TUniqueID masterID;
..
};
Ну и получать указатель по/от masterID. Для удаленного мастера вернется null, после выполнения undo мастер опять валиден. Кажется очень заманчивым, но тут свои минусы.

Цитата Сообщение от zayats80888 Посмотреть сообщение
И делаете это вот так, как вы делаете - добавлением данных-указателей и логики, которая не имеет отношения к назначению объекта, а призвана решать задачи уровня сцены/проекта/редактора.
Откуда предположения что я так делаю? Я хочу обсудить как это лучше делать/сделать, Вы напрасно называете это флудом.

Да, ф-ционал "найти/иметь всех slaves" полезен, но он точно не имеет никакого отношения к классу/функционалу "источник света". Да и дублировать его для каждого из таких ситуаций (а их уже > 20) явно плохо. Кроме того, зависимостей может быть 2 и более (для одного класса). В общем, надо это куда-то "поселить", в классе Light ему точно не место
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.07.2024, 19:54
Цитата Сообщение от Igor3D Посмотреть сообщение
Откуда предположения что я так делаю?
Эм, вы же сами это написали в 37 посте.
Цитата Сообщение от Igor3D Посмотреть сообщение
Я хочу обсудить как это лучше делать/сделать, Вы напрасно называете это флудом.
Нет, вы не читаете что вам пишут. Вы сами с собой общаетесь. Наглядно:
Цитата Сообщение от Igor3D Посмотреть сообщение
И что в этом плохого?
Цитата Сообщение от Igor3D Посмотреть сообщение
явно плохо
Вы можете дать ссылку на репозиторий с исходным кодом обсуждаемого проекта?

Добавлено через 5 минут
З.ы. Вопрос в заголовке темы давно исчерпан. Вы же продолжаете натягивать сову на глобус, искать какой-то дополнительный функционал... Код так не пишут, стараются придерживаться парадигмы "you aren't gonna need it".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.07.2024, 19:54
Помогаю со студенческими работами здесь

Указатель на фунцкию-член
class Letter { public: void(Letter::*side)(); Letter() { side = front; side = right_flang; side = top;

Указатель на функцию член
Вот урезаный донельзя код: class Window { public: ... bool registerClassEx()

Указатель на функцию-член
Доброго времени суток, возникла следующая ситуация: Приведу пример: class A { public: void a() { cout &lt;&lt; &quot;hello!&quot;;...

Указатель на функцию-член
Имеем следующий код: #include &lt;iostream&gt; using namespace std; class Windows { public: void OpenWindows() { cout &lt;&lt;...

Указатель на функцию-член класс
Я уже создавал одну тему, но обсуждения проблемы там навело меня еще на один вопрос. Для примера для пояснения возьму код из моего...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru