24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
C++ тред. Опять я. У меня возникла проблема. Есть класс AbstractObject. От него наследуется класс AirplaneObject. У класса AirplaneObject есть метод shootRockets();. В классе AbstractObject есть массивvector AbstractController'ов. С помощью наследования от этого класса я хочу создавать контроллеры, которые потом буду подключать к объектам. Что-то вроде скриптов лол. В данном случае -хочу создать контроллер, который будет вызывать метод shootRockets(); каждые 5 секунд. Как мне сделать, чтобы я мог получить доступ к объекту из контроллера? Могу добавить в метод update аргумент с типом AbstractObject, но каждый раз кастовать его в нужный тип я заебусь. В джаве есть прекрасная возможность - generic types. Пишешь T extends AbstractObject и при наследовании указываешь, какой тип должен быть у T. И он обязательно должен быть расширенным от AbstractObject. Как реализовать такое в C++? Прочитал про шаблоны - с ними такого сделать нельзя.
>AbstractObject Назови просто Object или лучше Entity. >AirplaneObject Просто Airplane. Пользователи твоего фреймворка и так поймут что все классы должны наследоваться от Object, так везде. Это слово Object тут просто не нужно. >AbstractController Если у тебя есть классы с названиями содержащими "Controller", "Manager", "Provider" и так далее, это признак плохого дизайна. Нужно переработать его так, чтобы все классы отражали какие-то ощутимые сущности. У тебя пиздец там какой-то напридуман. Лучше выкинь это всё и сформулируй задачу на русском языке.
Нахуя тебе в AbstractObject "контроллеры" для всех подклассов? Это же абстрактный объект, он ничего не должен знать о потомках. Не логичнее ли связывать контроллеры с конкретными дочерними классами.
>>86717595 Из всех контроллеров можно выделить что-то абстракное. Например, я хочу выделить метод update(), который будет почти одинаковым для всех контроллеров.
>>86717564 Во-первых нельзя полиморфный объект передавать по значению, потому что у тебя копируется только та часть объекта, которая принадлежит к AbstractObject, а все члены, добавленные в AirplanObject у тебя отвалятся, что приведет к распидорашиванию памяти. Передавать надо по ссылке (AbstractObject& object, double delta). Алсо, всегда вместо float используй double.
>>86717417 > Пользователи твоего фреймворка и так поймут что все классы должны наследоваться от Object Нет. AbstractObject - это объекты, которые будут присутствовать в игре. У них есть свой Entity и SceneNode, а так же набор контроллеров.
>>86718099 Чет всё равно непонятна за дизайн. Если есть АiroplaneСontroller и АbstrractController, в схеме нет ограничения, что АiroplaneСontroller будет только у Аiroplane. Чому Controller - внешний по отношению к Object?
>>86718242 А за этим я буду следить сам. Другого дизайна не придумал. Может я долбоёб и изобретаю велосипед, когда всё сделано за меня? Controller - это контроллер для объекта. Каким он ещё должен быть?
>>86716883 Ты, конечно - мудак. Но книгу посоветую: Приемы объектно-ориентированного проектирования. Паттерны проектирования. Э. Гамма, Р. Хелм, Р. Джонсон и Д. Влиссидес
И да, описывай задачу не как ебанутый первак, которой ток на пашкале то и может писать. (ну или бейск, лол)
>>86718948 Ну так перегрузи метод внутри класса или задай параметр, который модифицирует поведение контроллера, иначе какой смысл в объектах, если ты для них внешнее апи создаёшь?
>>86718989 Задать параметр, который модифицирует поведение контроллера? А если мне нужно будет в корне поменять это поведение? Через case чтоли все возможные варианты перечислять? Нет, лучше подключить другой контроллер.
>>86719185 Блядь. Есть дерево, на котором растут яблоки и груши. Червяки могут залезать как в яблоко, так и в грушу. Но для яблок свои червяки, а для груш - другие. У червяков можно взять абстрактную часть и вынести в отдельный класс. То есть все они являются членами класса AbstractChervyack. Для яблок YablokoChervyack, для груш - GrooshaChervyack. Груши с яблоками от этого охуели и решили избавиться от червяков. У червяка с классом YablokoChervyack есть метод UitiIzYablocka, а у червяка с классом GrooshaChervyack есть метод UitiIzGrooshi. Яблоки и груши не хотят кастовать класс AbstractChervyack в классы YablokoChervyack и GrooshaChervyack. Они хотят, чтоб было всё сразу заебись. Как избавиться от этого каста?
>>86719482 Прочитав эту хуету с грушами, у меня только один вопрос: что нетак с абстрактчервяк.уйти(абстрактовощ) Соответственно если у тебя овощ главный абстрактовощ.избавитьсяот(абстрактчерваяк)
>>86719790 Из груши червяк уходит спокойно на лапахони у него есть а из яблока - пританцовывая. Эти методы в корне разные. И только червяки знают, как избавить от себя яблоки и груши.
>>86720989 Был такой вариант. Я его даже реализовал. Но потом мне захотелось, чтобы у объекта было несколько контроллеров. Один его, например, крутит, а второй двигает вперёд. Можно объеденить в 1, но можно и так.
>>86721781 Ебт. Написал же про виртуальные методы. Если не знаешь, что это, почитай. А крутить-вертеть можно без наследования (все черви одинаково крутятся).
Прочитал тред и обзмеился с опа-дауна. Таким даугам, с мозгом засраным хуетой в духе ПОТЕРНЫ ЕТА КРУТА ЧЕМ БОЛЬЛЕ ПОТЕРНОВ ТЕМ ГИБЧИ И АРХИТИКТУРНИИ AbstractSingletobProxyFactoryBean не забудь имплементировать для каждого объекта сцены, только потом не удивляйся, что фпс упадет с 20 до 10, такова цена за гибкость. Такой говнокод никогда не сможет работать быстро, тольет plain old data является cache-friendly для процессора. Погугли про data oriented design, вот так делают серьезные игры с хорошим бытродействием, в dice например.
А чо, схема опа имеет права на жизнь. Пусть с ней все будет криво и будет тормозить, но работать будет. От кустов, оп, ты тут не отделаешься. В твоем случае предпочти динамик касты, потому что у тебя слаботипизированно получилось.
Опять я. У меня возникла проблема. Есть класс AbstractObject. От него наследуется класс AirplaneObject. У класса AirplaneObject есть метод shootRockets();. В классе AbstractObject есть массивvector AbstractController'ов. С помощью наследования от этого класса я хочу создавать контроллеры, которые потом буду подключать к объектам. Что-то вроде скриптов лол. В данном случае -хочу создать контроллер, который будет вызывать метод shootRockets(); каждые 5 секунд. Как мне сделать, чтобы я мог получить доступ к объекту из контроллера? Могу добавить в метод update аргумент с типом AbstractObject, но каждый раз кастовать его в нужный тип я заебусь. В джаве есть прекрасная возможность - generic types. Пишешь T extends AbstractObject и при наследовании указываешь, какой тип должен быть у T. И он обязательно должен быть расширенным от AbstractObject. Как реализовать такое в C++? Прочитал про шаблоны - с ними такого сделать нельзя.