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