u960
> ну как то кода Дума по проще выглядит
Если вы про 3-й Дум, то ему 11 лет ему уж как, естессно он проще выглядит ;)
К тому же Кармак сам не раз заявлял что он не сторонник С++, а пишет в стиле "Си с классами".
Хотя с эстетической точки зрения - мне код Дума 3 тоже нравится, но те игнорировать же теперь все новое?
innuendo
> Лично я не сторонник новых стандартов - пусть уж лучше множественного наследования :)
На ум приходит что-то про вкусы и фломастеры ;)
PS. Давайте не будем сваливаться в каментах в холивар на тему С++ vs C with classes. Хотя если наберется достаточное количество противников - я обещаю попросить модераторов удалить статью ;)
Кармак, говорите?
https://mobile.twitter.com/id_aa_carmack/status/26560399301
https://mobile.twitter.com/id_aa_carmack/status/172340532419375104
https://mobile.twitter.com/id_aa_carmack/status/330381704634179584
https://mobile.twitter.com/id_aa_carmack/status/452586892282695680
https://mobile.twitter.com/id_aa_carmack/status/452582113955426305
http://fabiensanglard.net/doom3/interviews.php :
Today, I do firmly believe that C++ is the right language for large, multi-developer projects with critical performance requirements, and Tech 5 is a lot better off for the Doom 3 experience.
Я вынужден настойчиво просить перестать флудить.
Я никого не призываю к использованию новых фишек языка С++ у себя, равно как и моего кода.
Данная статья дает пример как можно сделать. Не более.
Будут конструктивные коментарии по теме?
0r@ngE
> Будут конструктивные коментарии по теме?
Да. Переписать всё это на Си99...
На мой взгляд статья хорошая, лаконично сделана возможность подписываться на события с произвольным числом параметров.
Что добавил для себя в исходном коде - это возможность подписываться на события-функции
0r@ngE
> изза множественного наследования
попрошу, тут нету множественного наследования)
а в целом я соглашусь, не "сишное" это дело обсерверы
я бы сказал это у меня было академическое вдохновение.
завтра задам вопрос на форуме как решить одну проблему не прибегая к ним :)
IROV..
> попрошу, тут нету множественного наследования)
Но оно будет, ведь от этих обсерверов / визиторов придется наследоваться, не так ли? А игровые классы чаще всего от чего-то уже отнаследованы.
Ну и раз уже пошла такая пьянка, и сравнение моего кода с кодом самого Кармака (спасибо, я польщен таким сравнением ))
То давайте заглянем в исходники Doom 3 BFG Edition, а именно в папочку neo/d3xp/gamesys/
Внимательно изучим их вариант Event System в файлах Event.h / Event.cpp, а затем заглянем в Callbacks.cpp.
Сомневаюсь что это намного изящнее моего варианта, особенно если вам надо это отлаживать.
Огромное спасибо за статью!
Прочитав её, я понял, что нифига не понял C++ ушёл далеко вперёд с тех пор, когда я подзабил на кодинг :) Читал я про возможности boost, встроенные в C++, конечно, но все эти новые словечки зубрить и зубрить :D
Как все эти годы писались простые сайты и порталы без строгой типизации - непонятно, и без анонимных классов, и с опасным рандомом.
Так и Интернет сильно изменился за последние годы :)
0r@ngE
> Но оно будет, ведь от этих обсерверов / визиторов придется наследоваться, не
> так ли?
нет не нужно :) ты указываешь метод который вызовется когда придет сообщение.
вот как обещал создал тему, ну и там можно посмотреть как работает обсервер
IROV..
Посмотрел... Хммм.... Получается на каждый ивент нужно добавлять в класс новый член-обсервер, который будет реагировать на событие?
0r@ngE
> Получается на каждый ивент нужно добавлять в класс новый член-обсервер, который
> будет реагировать на событие?
Можно кастомизировать старые члены
innuendo
> Можно кастомизировать старые члены
Ну их в любом случае придется добавлять.
В моем варианте внедрений в класс таки минимальны.
ЗЫ. Я рад что мы таки к конструктиву перешли ;)
Не нравятся мне эти абстрактные event-системы. Непонятно что это за система такая и какая у нее ответственность. Я предпочитаю написать класс делегат(привет C#). И тогда сразу понятно что это такое.
Delegate.h:
template<typename... Args> class DelegateTemplate { typedef void(*fp)(Args...); std::vector<fp> _functions; public: void Add(fp func) { _functions.push_back(func); } void Invoke(const Args&... args) { for (auto func : _functions) func(args...); } }; /* Специализации делегата для конретных функций */ typedef DelegateTemplate<> Delegate; //...
Пример использования:
#include "Delegate.h" void event_handler1() { } void event_handler2() { } void main() { Delegate d; d.Add(event_handler1); d.Add(event_handler2); d.Invoke(); // Вызовет event_handler1(), event_handler() }
А так спасибо за статью! Наконец-то вдохнул свежего воздуха.
k-payl
> Я предпочитаю написать класс делегат(привет C#)
Ненавижу делегаты!
Тема в архиве.