![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Здравствуйте. Имеется такой набор классов:
А вот применение.
Мне этот код не нравится:
Вопрос: можно ли тут что-то придумать, чтобы код выглядел как-то так:
Спасибо. P.S. Какой-то сумбурный вопрос получился, но, я надеюсь, вы поняли, что я хотел ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
так чтоли?
Не знаю, до определения конкретных функций компилится. А вот пойдёт ли дальше , непонятно -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Нет. Мне не нравится код, который использует эти типы. И потом... Type_1 - это Snake, а не enum -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
akizelokro |
|
||||||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Тогда ничем не могу помочь. Всякие извраты навроде
или reinterpret<cast> вряд ли тебе интересны. Хотя, к первому изврату ещё можно приладить что-то типа
где ID запихнуть как переменную в Snake и передавать указатель на неё в fillSnake, раз ты всё равно в ptr пишешь ссылку на базовый класс для Snake. Хотя, всё равно проблематично, int придётся явно указывать на момент компиляции. Хотя, вроде скоро должен подтянутьсяпарень, который даст ответ на вопрос. кстати, интересно, "auto" будет работать на этом этапе? Это сообщение отредактировал(а) akizelokro - 11.9.2013, 19:16 -------------------- a = a + b; b = a - b; a = a - b; |
||||||
|
|||||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
borisbn, т.к. требуемый тип известен только во время выполнения, имхо нужно двигаться в сторону фабричного метода (но тогда всплывут нелюбимые enum).
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Думал об этом, но воплотить в код так и не получилось. Поможете ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
baldina |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
можно начать с
где
и закончить кодированием condition и sub_condition битовой маской, которую использовать в качестве ключа для соответствующей функции создания объекта Добавлено через 5 минут и 3 секунды в последнем случае - никаких enum, получится что-то вроде
|
||||||||
|
|||||||||
borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
baldina, спасибо. Понял. Но у меня после создания экземпляра конкретного класса идёт ещё его инициализация - одинаковая для всех 4-х классов. В вашем примере:
В общем, пока сделал так:
но и здесь мне не нравится copy-paste....
Хммм... интересно... надо подумать... -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
без повторений
кстати, почему бы для инициализации не использовать конструктор? |
|||
|
||||
akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
А что вы здесь делаете?
Прикурочьте указатель на функцию, которая (ые) вам 1, 2, 3, 4 будут возвращать. -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
![]()
Type_1 * t = new Type_1; находится внутри case'а и дальше не виден. У базового класса нет field1 и field2. Они есть только у наследников. См. внимательно иерархию классов в самом первом сообщении. В реальном проекте я не могу менять struct Snake
Не понял. Можете показать кодом ? baldina, akizelokro, не могли бы вы кодировать в "моих" терминах - Base, Snake, Type_X и т.п., а то иногда непонятно, что вы предлагаете. Спасибо. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
baldina |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
для этого сойдет шаблонная функция
Добавлено @ 18:32 или так:
Это сообщение отредактировал(а) baldina - 12.9.2013, 18:33 |
||||||
|
|||||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
теперь это практически не отличается от того, что было в самом первом сообщении ![]() Представьте, что мне нужно будет поменять сигнатуру функции setFields... В этом случае мне придётся исправлять её вызов в каждом case'е, а этого, как раз, мне и не хочется -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
хоть тут копипаста получается поменьше, но таки да, есть такое. и никуда от этого не деться, т.к. каждый тип должен создаваться отдельно.
и функция инициализации, как бы она не выглядела, применяется к разным типам. можно конечно в функцию инициализации передавать все значения одним параметром (в контейнере), но тут масса небольших технических проблем, и стоит ли такой огород городить, надо серьезно подумать. |
|||
|
||||
akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
ну, что-то такое, в таком роде. Дальше надо смотреть, а я так и не понял, что надо то и от чего можно отходить, а что отбрасывать нельзя. Да и компилятор далеко. Но мне, почему не знаю, это шаблоны с константами нарвятся даже меньше, чем enum. А идеологически, ИМХО, в языке только один метатип (указатели на функцию), да и со списками условий, а уж тем более констант по порядку, разбираются массивом этих указателей. Это сообщение отредактировал(а) akizelokro - 12.9.2013, 18:58 -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
borisbn, поверхностно посмотрел, (может чо не уловил)
в общем я бы сделал так
эту структуру, переименовал бы в класс, члены убрал бы в приват. А в паблик добавил виртуальные геттеры/сеттеры для каждого члена. Дальше, использование, почти как вы и хотели:
borisbn, так не пойдет? щас спешу просто, и не вникал глубоко, если что не пинайте. |
||||
|
|||||
mes |
|
||||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
не совсем, особенно учитывая реакцию на предложенные варианты ;) с базой все ясно :
а зачем менять ? можно так :
Добавлено через 2 минуты и 22 секунды если в "конструкторе" местами параметры поменять , то при вызове достаточно будет указать только id... но зависит от ситуации, нужно ли это.. Это сообщение отредактировал(а) mes - 13.9.2013, 22:13 |
||||||||
|
|||||||||
borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
volatile,
Пожалуй, остановлюсь на этом варианте. Всем большое спасибо. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
не понятно зачем ограничивать шаблонную функцию возвращением базового типа... во вторых не понятно , что на самом деле есть действительное ли условие или просто идентификатор.. часть копи-паста решается помешением в функцию .. возможно с возвращением креаторной функции.. но как мне кажется сложность заключается в том, что тс вместо задачи озвучивает свое видение решения... |
|||
|
||||
akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Ни один из вариантов мне не нравится.
Всё это не нравится и некрасиво. Даже с заданными начальными условия. А вот какой придурок мне поставил минус в статьях за закономерный смешок по поводу вооюще нуклюжего.. щас найду) Я сам тогда после реакции поржал. От количества дефайнов и тэгов код красивее не становится) Добавлено через 14 минут и 21 секунду я бы решил бы делать так int (*PF(bool, bool)) = 0; class template <PF> class IolkiPalki { bool conditiom; bool subcondition; int GoodBye() { IolkiPalki(condition, subcondition); }; Ну, мысль ясна. class Ave(bool s, bool s1) { if (s1) res =1; ... // тоси босе } template <class T, class PF> struct Snake: Base { ... int Bandaleiros( return PF.GoodBye(); }; } bool condition.. bool subcondition ... Ave ave(condition, subcondition); -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Ок. Есть два приложения, которые обмениваются по сети. Интерфейс сетевого модуля требует на входе Base * (на самом деле, как Вы понимаете, в нём побольше функций, чем я привёл). Если я хочу отправить некие данные, то я должен создать наследника Base, заполнить его поля и передать его в сетевой модуль. Тот его сериализует и отправит по сети. На приёме в зависимости от типа упаковки (ID) он десериализуется и отправляется "подписчику". В случае, который я описал, конкретный тип (ID) сетевой упаковки определялся по некоторым условиям (да, действительно условиям, а не "просто идентификатор"), однако содержимое упаковок абсолютно одинаковое. Код, который я привёл в первом сообщении мне не понравился, и я подумал, что коллективный разум мне поможет ![]()
Что это было ??? akizelokro, Вы точно не ошиблись веткой ? ![]()
У типа нельзя вызывать нестатические методы ![]() Это сообщение отредактировал(а) borisbn - 16.9.2013, 10:32 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
так зачем плодить наследников, если отличие только в id ?? сделайте одного наследника с динамическим id и радуйтесь жизни ![]() или есть еще условия, не озвученные здесь ?! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |