Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
AntonChik
1084 / 582 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
#1

Вектор объектов разных классов. Доступ к свойствам элемента вектора - C++

28.05.2013, 09:11. Просмотров 2594. Ответов 31
Метки нет (Все метки)

есть базовый класс
C++
1
2
3
4
class A
{
//...
}
есть производные классы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class A1 : public A
{
//...
public:
int a;
}
 
class A2 : public A
{
//...
public:
int a;
}
создаю вектор объектов
C++
1
2
3
4
std::vector<A> v;
v.push_back(new A1());
v.push_back(new A2());
//и т.д.
как теперь получать доступ к a, которого нет в базовом классе?
насколько приемлемо писать так:
C++
1
2
3
4
5
6
7
8
if(dynamic_cast<A1 *>(v[i]))
        {
        a_get=((A1 *)(v[i]))->a;
        }
if(dynamic_cast<A2 *>(v[i]))
        {
        a_get=((A2 *)(v[i]))->a;
        }
особенно если производных классов будет много?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2013, 09:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вектор объектов разных классов. Доступ к свойствам элемента вектора (C++):

Разработать иерархию классов, демонстрирующее работу с коллекцией объектов разных классов - C++
Задание: Разработать в соответствии с индивидуальным заданием иерархию классов и приложение, демонстрирующее работу с коллекцией объектов...

Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А - C++
Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А на начало, а...

Взаимодействие объектов разных классов - C++
Я или туплю или чего-то не понимаю\не до понимаю. Вопрос в самом коде. class Player { int health; int damage; public: ...

Массив объектов разных производных классов - C++
Задача такая: базовый класс - фигура, производные классы - круг, треугольник и т.п. Пользователь выбирает, какие фигуры будут на экране и...

Создание коллекции объектов разных классов - C++
Здравствуйте. Помогите, пожалуйста, с задачкой создания коллекции объектов разных типов. Я сначала реализовал программку, использовав...

Запись и чтение объектов разных классов в один файл - C++
Здравствуйте. Изучаю С++ по Лафоре. Дошёл до места, где объясняется, как записывать объекты разных классов в один бинарник. У Лафоре,...

31
alkagolik
Заблокирован
30.05.2013, 09:18 #16
унаследуй любовь к людям!
0
stima
487 / 339 / 39
Регистрация: 22.03.2011
Сообщений: 1,084
Завершенные тесты: 2
30.05.2013, 09:19 #17
Цитата Сообщение от ITcrusader Посмотреть сообщение
Если же не все производные классы имеют такой атрибут, все гораздо сложнее.
Они все имеют такие поля, какие есть в базовом классе но с разными модификаторами доступа (ибо как гласит ООП инкапсуляци маст би).

Конкретизируй пример и тогда тебе ответят поточней. А так мы разговариваем лишь о вариантах которых ты можешь сделать (как минимум 5 вариантов)
0
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
30.05.2013, 09:21 #18
Цитата Сообщение от stima Посмотреть сообщение
Они все имеют такие поля, какие есть в базовом классе но с разными модификаторами доступа (ибо как гласит ООП инкапсуляци маст би).
С чего вдруг все?
Может у него несколько производных имеют свойство "а", а несколько - нет. Базовый-то - пустой у него.
0
stima
487 / 339 / 39
Регистрация: 22.03.2011
Сообщений: 1,084
Завершенные тесты: 2
30.05.2013, 09:25 #19
ITcrusader, уточню ... я отвечал подразумевая это
C++
1
2
class A {int a;}
class B : A {};
Просто прочитайте внимательней)
0
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
30.05.2013, 09:32 #20
stima, ну ёлы палы) ну ясно, это ж основы ООП. Вопрос-то почему возник - потому что базовый класс свойства этого не содержит, но его содержат пара производных. Если ими иерархия исчерпана, да, интерфейс базового - решит задачу на ура, если же не исчерпана - вариантов решения несколько и они немного иные, один из которых - добавление промежуточных классов, наследующих от А и являющихся базовыми для: "a"-содержащих классов и не содержащих этого "a" классов.
0
stima
487 / 339 / 39
Регистрация: 22.03.2011
Сообщений: 1,084
Завершенные тесты: 2
30.05.2013, 09:35 #21
ITcrusader, я понимаю), но как я и ответил ранее, более конкретный ответ кроется за применением.
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,535
Завершенные тесты: 1
30.05.2013, 09:38 #22
Цитата Сообщение от AntonChik Посмотреть сообщение
насколько приемлемо писать так:
AntonChik, а чем вас не устраивает ваше же статическое приведение типа? Работает.
C++
1
2
3
4
5
6
vector<A*> v;
v.push_back(new A1());
v.push_back(new A2());
 
((A1*)v[0])->a = 99;
((A2*)v[1])->a = 200;
Только верно ли будет в один вектор пихать разные объекты? Если у нас в А1 будет много полей, а в А2 ни одного, справится ли с этим vector?
И на сколько аккуратным надо быть, если таких унаследованных классов будет много, чтобы не поступить вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A1: public A
{public:
 
int a;}; // !!!
 
class A2: public A
{public:
 
float a;}; // !!!
 
 
vector<A*> v;
v.push_back(new A1());
v.push_back(new A2());
 
((A1*)v[0])->a = 99;
((A2*)v[1])->a = 200;
 
((A1*)v[1])->a == ?;
((A2*)v[0])->a == ?;
0
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
30.05.2013, 09:41 #23
да вообще, идея применения приведения вниз по иерархии - в большинстве случаев - плоха, поэтому, автор, пости реальный пример с подробными разъяснениями)))
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,535
Завершенные тесты: 1
30.05.2013, 09:45 #24
Цитата Сообщение от ITcrusader Посмотреть сообщение
идея применения приведения вниз по иерархии - в большинстве случаев - плоха
Чем? Поясните пожалуйста. Вон на том же конкретном маленьком примере. И как сделать лучше/по другому?
0
AntonChik
1084 / 582 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
30.05.2013, 09:53  [ТС] #25
Цитата Сообщение от SatanaXIII Посмотреть сообщение
а чем вас не устраивает ваше же статическое приведение типа? Работает.
не прокатит перебирая элементы вектора в цикле.

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Только верно ли будет в один вектор пихать разные объекты?
верно, если есть необходимость.
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Если у нас в А1 будет много полей, а в А2 ни одного, справится ли с этим vector?
справится.
Цитата Сообщение от SatanaXIII Посмотреть сообщение
И на сколько аккуратным надо быть...
предельно аккуратным надо быть всегда)

Цитата Сообщение от ITcrusader Посмотреть сообщение
поэтому, автор, пости реальный пример с подробными разъяснениями)))
этот пример вполне сойдет за реальный, ни больше ни меньше.
чувствую, что наверное все-таки придется расширить базовый(промежуточно базовый) класс или поменять логику, но все же сам момент интересен.
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,535
Завершенные тесты: 1
30.05.2013, 09:56 #26
Цитата Сообщение от AntonChik Посмотреть сообщение
не прокатит перебирая элементы вектора в цикле.
Для этого есть итераторы. И раз контейнер
Цитата Сообщение от AntonChik Посмотреть сообщение
справится
, то и итератор должен.
0
stima
487 / 339 / 39
Регистрация: 22.03.2011
Сообщений: 1,084
Завершенные тесты: 2
30.05.2013, 09:57 #27
Я понял вашу логику)). Дайте определение массива (в данном случае вектора) и Вы поймете, что Вам делать.
0
AntonChik
1084 / 582 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
30.05.2013, 09:58  [ТС] #28
и как итератор поможет в определении класса элемента?)
0
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
30.05.2013, 09:58 #29
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
SatanaXIII, блин. Я устал уже тут писать про расширение иерархии. Не всегда красиво смотреться будет, конечно, зависит от конкретной области моделирования. Но освобождает от необходимости приведения типов, проверки правильности приведения и т.д.
Далее, все зависит от того еще, например, просто ли мы хотим выполнить GetProperty. Или, например, запустить операцию изменения состояния объекта, которой нет в базовом, но которая есть в паре производных, а в остальных производных на том же уровне отсутствует, тут можно не расширять иерархию, но реализовать эту функцию везде, просто в тех классах, где её быть не должно - оставить её пустой, холостой, как угодно. Или выбрасывающей обрабатываемое исключение, или, или...

Ясно лишь, что если возникает потребность в подобного рода приведении - это наводит на мысль о том, что спроектировать лучше по-другому. Бред - использовать наследование, фишка которого - обеспечить общность, а при этом сидеть и от общего переходить к частному, обрабатывая разные вариации. Думаю, будет правильно сказать, что наследование - призвано обобщить нечто общее - здесь все наоборот.
3
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,535
Завершенные тесты: 1
30.05.2013, 10:05 #30
Цитата Сообщение от AntonChik Посмотреть сообщение
и как итератор поможет в определении класса элемента?)
Никак. Но по крайней мере мы не обратимся в середину какого-то элемента. Я об этом.
В целом задумка как-то не очень по моему - разнотипные объекты пихать в одну кучу.

Цитата Сообщение от ITcrusader Посмотреть сообщение
Я устал уже тут писать про расширение иерархии.
Выложите куда-нибудь в блог или ссылку приводите на самый развернутый ответ, чтобы по десять раз одно и то же не повторять. )
0
30.05.2013, 10:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2013, 10:05
Привет! Вот еще темы с ответами:

Как создать массив из объектов разных классов, имеющих общего предка? - C++
Есть основной класc 'Автомобиль' его наследуют 3 класса: мини вен, купе и седан. Как создать массив объектов класса 'автомобиль' что бы...

Добавление элемента в вектор классов - C++
Есть два класса Product и List. В List есть вектор vector&lt;Product &gt; _pr. Каким образом добавить новый элемент в вектор? Этот код не...

Массив объектов класса, отладка, доступ к полям элемента массива - C++
Доброго времени! Создал класс с полем char и int. Person.h #ifndef PERSON_H #define PERSON_H //#include &lt;iostream&gt; using...

c++ доступ к protected свойствам - C++
давайте рассмотрим доступ к protected свойствам и методам класса известно что напрямую их вызвать можно только внутри класса...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru