![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Корректен ли такой код:
|
|||
|
||||
| AndyY |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
корректен. учитывай, что конструктор вызовется при первом обращении к функции.
|
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Но если деструктор MyClass сделать приватным, то компилятор ругается.
Почему? |
|||
|
||||
| AndyY |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
потому что Function - не имеет доступа к приватным мемберам.
а зачем его делать приватным? |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Ага, тогда почему идет обращение к деструктору????
|
|||
|
||||
| AndyY |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
при выгрузке модуля (например, завершении проги) вызываются деструкторы у всех статических объектов (у которых были вызваны конструкторы
|
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Да, но функция является дружественной классу и конструктор у меня в приватах.
Идея такова, что доступ к классу имеет одна функция. Типа Singleton. Лучше приведу пример (наверное много глупостей
|
|||
|
||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 5 Всего: 44 |
Да глупостей много, начиная уже с первых двух строк template<typename T> void InitDispatch() { } А что кроме как делать private деструктор выхода из ситуации нет? Може там где ты объявляешь дружественную функцию, и где функцию описываешь разные прототипы в этом легко напортачить особенно с шаблонами? -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| achmed |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 12.4.2004 Репутация: нет Всего: нет |
правило в C++: последним создан, первым уничтожен. Добавлено @ 18:36 элегантный шаблон Singletone (вроде предложен Майерсом, может я ошибаюсь) template <class T> T * Singletone() { static T s; return &S; } Это сообщение отредактировал(а) achmed - 1.6.2004, 13:25 |
|||
|
||||
| AndyY |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
achmed
правило прописано в стандарте? IMHO это просто конкретная реализация CRT (статические объекты складываются в какой-то список). один фиг юзать невозможно, поскольку никто не знает последовательность создания. Да и удобство сомнительное. btw а почему не сделать деструктор protected? и еще вопрос на грани офтопика - зачем столько кода, который не делает ничего? неужели он хоть раз помог кому-то помог избежать ошибки? |
|||
|
||||
| bel_nikita |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Nastya
А что глупого в этих строчках?
Обясните пожалуйста. Не вижу ничего странного в строчке template<typename T> void InitDispatch()
Это хочу настраиваемый диспетчер сообщений забомбить |
||||||
|
|||||||
| AndyY |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
bel_nikita
А что такое диспатчер сообщений Все-же не пойму, зачем так сложно. кстати, приведу пример - как сделано у меня:
и обращаешься: module *p = module::static_ptr(); ... это конечно далеко от совершенства, но ситуаций с ошибкой в коде связанной с этой конструкцией не было. зачем делать больше? |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
В проге есть различные объекты. У каждого свой тип (TypeObject) и идентификационный номер (ID). И все объекты должны обмениваться сообщениями между собой. Т.е. есть некий виртуальный базовый класс с функцией, типа ProcessMessage(Message). А диспетчер должен управлять сообщениями. То бишь есть глобальная очередь сообщений, куда все объекты, производные от базового, складывают свои события. Диспетчер фильтрует, например в отдельном треде, сообщения и вызывает виртуальную функцию ProcessMessage(Message) для объекта, которому предназначено данное сообщение. Вот, такая вот не хитрая конструкция Че-та написал, не знаю, понятно ли? |
|||
|
||||
| AndyY |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
bel_nikita
интересная задача. тред я пожалуй не стал бы пускать - тормозить будет. или он или интерфейс... А вот обработчики в разных тредах - есть над чем подумать. а почему базовый класс виртуальный? и зачем вообще вся тема с синглетоном - ведь понятно, что диспатчер один... а если он не один будет - грубо говоря в другом окне потребуется другая чехарда с объектами? обломс с синглетоном. |
|||
|
||||
| bel_nikita |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Не правильно изложил мысль
Да, он должен быть один, но не хочется привязываться к конкретному типу сообщения. Типа, чтоб была сразу библиотека готовая и настраиваемая. Чтобы можно было без труда в другой проект перенести. Но если делать дипетчер через шаблон, то можно в проге два диспечера сделать с различными типами сообщений и базовыми объектами. Но это так из области фантастики Еще вот,что: я не под WIN32 сижу. Так, что окна мне не страшны Вот, приведу еще пример базового класса:
Мысля такова: Если создается объект, производный от базового класса, то поитер заносится в статический МАР. А когда диспетчер имеет сообщение, то он бежит по этому МАРу и отыскивает нужный объект(т.е. которому предназначено сообщение) и вызывает виртуальный метод ProcessMessage(const Message&). А если объект, производный от базового, удаляется, то базовый деструктор удаляет свой поитер из МАР. Т.е. можно динамически создавать и удалять объекты в процессе работы проги. И все они могут свободно обмениваться событиями между собой. Вроде так Но, вот подумал. А если этих объектов пару тысяц будет? Долго искать придется Это сообщение отредактировал(а) bel_nikita - 1.6.2004, 13:20 |
||||||
|
|||||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
А если будет вот такая ситуация: диспетчер сообщений вызвал в своём треде ProcessMessage объекта A, но в процессе обработки мессаги объект A (в другом треде) вдруг прекратил своё существование (вызов деструктора, удаление пойнтера из MAP), то что тогда ? По идее, упасть должно -------------------- ![]() |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Но синхронизация на что? Блокируем доступ к разделяемым ресурсам на время вызова ProcessMessage и изменения в МАРе. А если диспетчер иммет мессагу, но этого объекта уже нет, то зачем это сообщение? Удаляем его из очереди.... Тут надо подумать... Это сообщение отредактировал(а) bel_nikita - 1.6.2004, 14:17 |
|||
|
||||
| AndyY |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
2000 для нормальной мапы - пустяки, максимальный путь поиска - 11 сравнений (2048 элементов)
только вот криво это - если 2000 объектам нужно как-то реагировать на событие. Вот если 1-2 объекта - это понятно... А объекты одного типа лучше обрабатывать вместе (забавно посмотреть как реализован механизм нотификации через IConnectionPoint у микрософтов. еще раз вернусь к вопросу - нафига все-же синглетон? тем более с неочевидным синтаксисом. я считаю что если что-то можно написать просто и понятно, мудрить тут не стоит - потеряешь время сначала на красоту, а потом на лишние глюки. автор stl похоже со мной не согласен |
|||
|
||||
| bel_nikita |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Какие предложения есть? Через new... как-то не катит. Сделать все методы диспетчера статическими?...В принципе так и делаю
А это как? Не понял? А по мне дык STLport - rulezzz |
||||
|
|||||
| AndyY |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
Как? ну, самое простое, в хидере:
class dispatcher { ///методы }; extern dispatcher g_disp; в .cpp: dispatcher g_disp; и все! про обработку: например, у тебя 1000 объектов, которые нужно перерисовать (у них изменилось общее свойство). разумнее их перерисовать все скопом специализированной функцией, чем по одному (как минимум экономия на вызове виртуальной функции). Зачастую и алгоритм оптимизировать - например в windows 1000 вызовов Invalidate/UpdateWindow выполнятся намного медленней, чем для 1. В общем наличие большого числа листенеров сообщений - повод их объеденить в спец. менеджер, который и будет обрабатывать события для всех объектов вместе. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Подсказка: у 20-ти объектов одного и того же базового класса, скорее всего будет 20 однотипных обработчиков сообщений. Так что можно вместо внешнего класса сделать внутренний класс CMessageDispatcher, который будет обеспечивать обработку мессаг для всех классов, производных от данного (т.е. хранить MAP, вызывать ProcessMessage и т.п.).
Для генерации сообщения достаточно будет вызвать метод FireMessage любого объекта. Данный метод вызовет ProcessMessage объекта, и т.п. Реализация будет зависеть от реализации вирт. ф-ции FireMessage объекта (которая может делать всё что угодно - от простого вызова ProcessMessage данного объекта, до перебора всех элементов MAP данного объекта). Идея, в общем-то простая. У каждого объекта есть набор однотипных свойств, поэтому есть набор однотипных событий, значит такие объекты могут быть объединены в один MAP обработки событий....... -------------------- ![]() |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |