![]() |
|
Модераторы: 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 |
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |