|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
17.08.2016, 23:10 | #1 |
Пользователь
Регистрация: 14.10.2015
Сообщений: 17
|
Проблемы с проектированием и дизайном
Здравствуйте, у меня есть некий класс А, чисто виртуальный. От него наследуются другие классы. Затем, что бы использовать функционал виртуальных функций, мне нужно оперировать либо указателями, либо ссылками. И вот, собственно, в другом классе мне нужен Вектор таких вот объектов, в итоге я в классе создаю вектор указателей на базовый класс. Такой подход, требует передачи этого самого вектора указателей в конструктор и т.п При том, что изначально, до создания объекта данного класса мы имеем просто вектор объектов. Да и вообще, для грамотного кеширования хорошо иметь подряд идущие элементы, а не разбросанные созданием через NEW. Естественно, для того чтобы инициализировать свой класс, я создаю вектор указателей, и по вектору объектов беру и заполняю этот вектор, что весьма неудобно. Подскажите, может есть другой, какой способ избежать создание еще одного вектора.... Ведь мне это понятно, а вот другому пользователю, будет уже не очень.
|
18.08.2016, 08:35 | #2 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,085
|
Если я правильно понял вашу проблему, то тут можно прилепить шаблоны.
Код:
|
18.08.2016, 10:36 | #3 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Похоже, что вы пытаетесь использовать вируальные функции там, где они просто не нужны. У них весьма узкая специализация - они работают там, где тип объекта с которым будет работать некоторый алгоритм не известен на момент компилции. Например, пользователь вводит с консоли либо 1, либо 2. Если один, то создаём new B, если 2, то new C. Оба (B и C являются наследниками виртуального A). Таким образом, мы избежали написания разных алгоримов отдельно для B и C, а в обоих случаях работаем с A.
Для всего остального (типы известны на момент компиляции) есть шаблоны. Если хотите передавать разные векторы в одну функцию: Код:
Код:
Если же использовать new очень хочется, а стандартный механизм не устраивает, то можно посмотреть в сторону placement new или в сторону написания своих new/delete либо для класса, либо глобально. |
18.08.2016, 12:25 | #4 |
Пользователь
Регистрация: 14.10.2015
Сообщений: 17
|
Господа, да - шаблоны мне в голову тоже приходили, но тогда, получается так, что этот самый тип, а далее и объект этого пользовательского типа, если будет содержаться в других классах, то и эти классы должны будут быть шаблонными, так ведь ?
Это тоже не очень удобно, да и выглядит странно :? |
18.08.2016, 12:52 | #5 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Навскидку предложу ещё один вариант:
Код:
|
18.08.2016, 16:44 | #6 |
Пользователь
Регистрация: 14.10.2015
Сообщений: 17
|
Ну вот в вашем примере, выше - да, можем создать объект базового класса, указав с треугольных скобках нужный тип, однако, если я буду хранить данный объект в другом классе, то опять же - этот нужный тип, придется задавать шаблоном, который будет применим еще и к тому классу, в котором хранится данный объект.
А еще, все методы классов в которых мы передаем указатель на базовый, так же будут зависеть от типа, как следствие будут тоже созданы через шаблон. Который нужен то был, совсем для других объектов. Не красиво выходит. |
18.08.2016, 17:59 | #7 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Типа это?
Код:
|
18.08.2016, 18:44 | #8 | |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Цитата:
Код:
|
|
18.08.2016, 19:10 | #9 |
Пользователь
Регистрация: 14.10.2015
Сообщений: 17
|
"С чего вы взяли? Вот, FF не шаблон:"
Ну это если мы заранее знаем тип. Не спорю. Но в моем случае - тип всегда задает пользователь, когда пишет код. Мягко говоря есть объекты - Итемы, у них есть метод, получить такое то свойство. Итемы хранятся в другой структуре, которая оперирует с ними. Итем могут быть разными - фигуры, сцены и т.п... Только виртуальность задает те пераметры, которые нужны, для того чтобы код работал как надо - т.е пара функций чисто виртуальных. Вот как то так. В страктура что оперирует над ними, хранит целый вектор этих итемов. Что бы все работало верно, приходится да, использовать указатель на базовый класс. Но я решил переделать дизайн и сделал так, чтобы пользователь, переопределяя структуру данных, сам в ней создавал данный массив, а не чтобы он хранился в базовом классе. Т.е можно создать и массив объектов, а не указателей. Главное, чтобы Вирт. Функции работали как надо. Ну да, виртуальность не дает конечно оптимизации 100%, ибо поиски функций выполняются во время выполнения, но С++ и высоко оптимизированный код - дело, не совсем этичное, как мне кажется. Нужны оптимизации - есть С. И тут же обматерюсь, что в х64 MSVC - нельзя делать ASM вставки, что никак не говорит о 100% оптимизации. Особенно когда речь идет о SIMD. Последний раз редактировалось m3g4z0rdEX; 18.08.2016 в 19:14. |
18.08.2016, 20:48 | #10 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проблемы с vba (проблемы создания макросов) | Leojse | Microsoft Office Excel | 4 | 26.12.2013 20:09 |
Вопрос с дизайном | Furyon | HTML и CSS | 9 | 14.05.2011 09:11 |
трабл с проектированием БД запчастей автомобильных | agent007 | Microsoft Office Access | 8 | 12.04.2011 20:27 |
Решил занятся веб дизайном | Zveroboy | Свободное общение | 5 | 05.08.2009 01:25 |