Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
BAIZOR
0 / 0 / 1
Регистрация: 30.10.2010
Сообщений: 68
#1

ООП + полиморфизм = wtf? - C++

27.08.2011, 19:49. Просмотров 2014. Ответов 40
Метки нет (Все метки)

Есть:
Класс A - отец
Класс Б - дочерний
Класс Ц - дочерный, наследуеться от А(сестра Б)

Есть массив типа А, с названием Mass.
Он хранит в себе объекты классов Б и Ц.

в классе Б есть функция F().
в классе Ц есть функция F() (отличающаяся функционалом).

Внамание! Вопрос:
как провернуть такую часть кода - Mass[0..100].F();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2011, 19:49
Я подобрал для вас темы с готовыми решениями и ответами на вопрос ООП + полиморфизм = wtf? (C++):

ООП. Полиморфизм
Мальчики, учусь на МехМате. Для сдачи зачёта по ООП необходимо написать...

ООП Полиморфизм Наследование
У меня есть базовый класс и 2 производных от него класса... Как сделать, чтобы...

Полиморфизм инкапсуляция и наследование(ООП)
Не как не могу понять зачем нужен Полиморфизм и инкапсуляция и их определение...

Подкиньте практику по ООП + полиморфизм + шаблоны пожалуйста.
Здравствуйте форумчане. Хотел бы попросить подбросить практику по таким темам:...

ООП в С++ (наследование, инкапсуляция, полиморфизм, перегрузка операторов): что читать?
Нужно освежить, подзабылось. Были у меня институцкие методички доцента...

Очередное WTF )))
Вот до чего меня жизнь довела: имеем файл file.txt который содержит просто...

40
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
27.08.2011, 19:53 #2
В цикле, вестимо.
0
ЛеЖиК)
185 / 60 / 4
Регистрация: 29.04.2011
Сообщений: 642
27.08.2011, 19:54 #3
C++
1
2
for(int i=0;i<100;i++)
     Mass[i].f();
0
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
27.08.2011, 19:57 #4
Только выглядеть это должно бы
C++
1
Mass[i]->f();
а функция f() должна быть виртуальной.
0
BAIZOR
0 / 0 / 1
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:04  [ТС] #5
Цитата Сообщение от grizlik78 Посмотреть сообщение
Только выглядеть это должно бы
C++
1
Mass[i]->f();
а функция f() должна быть виртуальной.

D3D_UI == клас А
D3DXButton == класс Б
setStatus == F()

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class D3D_UI
{
public:
      ....
      virtual void setStatus(LPVOID Object,int newstatus);
};
 
class D3DXButton : public D3D_UI
{
public:
  ...........
    void setStatus(LPVOID Object,int newstatus)
    {
           ....
        }
};
Error 75 error LNK2001: unresolved external symbol "public: virtual void __thiscall D3D_UI::setStatus(void *,int)" (?setStatus@D3D_UI@@UAEXPAXH@Z) C:\Users\BAIZOR\Desktop\Robotino V3 Directx 9 - копия\Robotino V2 Directx 9\Robotino V2 Directx 9.obj Robotino V2 Directx 9

Добавлено через 1 минуту
А если юзать в вызове ->


Error 23 error C2819: type 'D3D_UI' does not have an overloaded member 'operator ->' c:\users\baizor\desktop\robotino v3 directx 9 - копия\robotino v2 directx 9\Direct_All.h 710 1 Robotino V2 Directx 9
0
Bers
Заблокирован
27.08.2011, 20:07 #6
ну он вам пишет, что объект пытается использовать функцию, у которой отсутствует тело.

C++
1
2
3
4
void setStatus(LPVOID Object,int newstatus)
{
....
}
Надо ж ещё указывать имя класса, к которому эта функция относится
0
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
27.08.2011, 20:09 #7
Цитата Сообщение от BAIZOR Посмотреть сообщение
Error 75 error LNK2001: unresolved external symbol "public: virtual void __thiscall D3D_UI::setStatus(void *,int)" (?setStatus@D3D_UI@@UAEXPAXH@Z) C:\Users\BAIZOR\Desktop\Robotino V3 Directx 9 - копия\Robotino V2 Directx 9\Robotino V2 Directx 9.obj Robotino V2 Directx 9
Ну так определение setStatus() для класса D3D_UI есть?
Или, если класс D3D_UI абстрактный, то функцию надо объявить в этом классе как "чистую виртуальную"
C++
1
virtual void setStatus(LPVOID Object,int newstatus) = 0;
Цитата Сообщение от BAIZOR Посмотреть сообщение
А если юзать в вызове ->
А как Вы создаёте массив "детей" без указателей?

Добавлено через 1 минуту
Цитата Сообщение от Bers Посмотреть сообщение
Надо ж ещё указывать имя класса, к которому эта функция относится
Да у него эта функция для "дитя". Внутри определения класса.
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
27.08.2011, 20:09 #8
Цитата Сообщение от BAIZOR Посмотреть сообщение
Есть:
Класс A - отец
Класс Б - дочерний
Класс Ц - дочерный, наследуеться от А(сестра Б)
Есть массив типа А, с названием Mass.
Он хранит в себе объекты классов Б и Ц.
в классе Б есть функция F().
в классе Ц есть функция F() (отличающаяся функционалом).
Внамание! Вопрос:
как провернуть такую часть кода - Mass[0..100].F();
Ну, во-первых не массив, а вектор, во-вторых не типа А, а типа А*,
ну и, в третьих, нужно воспользоваться алгоритмом for_each.
0
Bers
Заблокирован
27.08.2011, 20:10 #9
/зы

Как вариант, можно вместо виртуальной функции заюзать паттерн "стратегия".
То бишь, использовать функторы, либо указатели на функцию, либо стратегии при помощи шаблонов.
0
Сыроежка
Заблокирован
27.08.2011, 20:10 #10
Цитата Сообщение от BAIZOR Посмотреть сообщение
Есть:
Класс A - отец
Класс Б - дочерний
Класс Ц - дочерный, наследуеться от А(сестра Б)

Есть массив типа А, с названием Mass.
Он хранит в себе объекты классов Б и Ц.

в классе Б есть функция F().
в классе Ц есть функция F() (отличающаяся функционалом).

Внамание! Вопрос:
как провернуть такую часть кода - Mass[0..100].F();
Массив типа A не может в себе хранить объекты B и C. Это может делать только массив указателей на класс A.
0
grizlik78
27.08.2011, 20:12
  #11

Не по теме:

Отец, сестра... Как вы у них пол различаете? :D

0
BAIZOR
0 / 0 / 1
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:12  [ТС] #12
Цитата Сообщение от Bers Посмотреть сообщение
ну он вам пишет, что объект пытается использовать функцию, у которой отсутствует тело.

C++
1
2
3
4
void setStatus(LPVOID Object,int newstatus)
{
....
}
Надо ж ещё указывать имя класса, к которому эта функция относится

но мне нужен вызов функции из детей а не отца...
0
silent_1991
27.08.2011, 20:13
  #13

Не по теме:

grizlik78, нуу, у Б есть такая дырочка, а у Ц есть такой хвостик... :D:D

1
BAIZOR
0 / 0 / 1
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:14  [ТС] #14
Цитата Сообщение от grizlik78 Посмотреть сообщение
А как Вы создаёте массив "детей" без указателей?
UI == Mass

C++
1
2
D3DXButton Connect(...);
UI.push_back(Connect);
Добавлено через 40 секунд
Цитата Сообщение от grizlik78 Посмотреть сообщение
Отец, сестра... Как вы у них пол различаете?
годы практики xDD))
0
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
27.08.2011, 20:15 #15
Цитата Сообщение от BAIZOR Посмотреть сообщение
но мне нужен вызов функции из детей а не отца...
Так вызываете-то Вы их пока именно от отца. А даже если сделать правильно, то либо придётся для отца её определить, пусть и с пустым телом, либо сделать родительский класс абстрактным.
0
Bers
Заблокирован
27.08.2011, 20:15 #16
Цитата Сообщение от grizlik78 Посмотреть сообщение
Да у него эта функция для "дитя". Внутри определения класса.
Аааа... точна-точна. Действительно!

В общем, если кратко: класс А должен содержать интерфейс управления всем семейством полиморфных классов.

А класс Б, как потомок класса А - лишь конкретные реализации виртуальных методов класса А.
И тогда все будит нормально.
0
Сыроежка
Заблокирован
27.08.2011, 20:16 #17
Цитата Сообщение от BAIZOR Посмотреть сообщение
А если юзать в вызове ->


Error 23 error C2819: type 'D3D_UI' does not have an overloaded member 'operator ->' c:\users\baizor\desktop\robotino v3 directx 9 - копия\robotino v2 directx 9\Direct_All.h 710 1 Robotino V2 Directx 9
Это сообщение ясно, почему берется. Вы пытаетесь к объекту класса применить оператор ->, а в вашем классе этот оператор не определен. То есть у вас изначально неправильная конструкция. Наверное, когда вы формировали свой массив типа A, вы присваивали его элементам объекты класса B и C. Но в этом случае происходила "срезка", то есть в элементы вашего массива заносились лишь базовый класс ваших производных классов B и C.

Может быть вам следуеть базовый класс A объявить как абстрактный, и тогда бы вы такой ошибки неправильной конструкции массива не допустили бы, так как на этапе компиляции компилятор выловил бы такую ошибку, как объявление массива типа A и присваивание его элементам производных классов B и C.
0
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
27.08.2011, 20:18 #18
Цитата Сообщение от BAIZOR Посмотреть сообщение
UI == Mass

C++
1
2
D3DXButton Connect(...);
UI.push_back(Connect);
Да, да. Пока именно "срезка" и получается.
0
BAIZOR
0 / 0 / 1
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:20  [ТС] #19
Цитата Сообщение от Сыроежка Посмотреть сообщение
Это сообщение ясно, почему берется. Вы пытаетесь к объекту класса применить оператор ->, а в вашем классе этот оператор не определен. То есть у вас изначально неправильная конструкция. Наверное, когда вы формировали свой массив типа A, вы присваивали его элементам объекты класса B и C. Но в этом случае происходила "срезка", то есть в элементы вашего массива заносились лишь базовый класс ваших производных классов B и C.
Спасибо, мне предложили этот вариант, и я просто продемонтрировал что он не рабочий.




Я уже понял все, только одного не знаю - как сделать класс Абстрактным, я давненько это делал... в нем не может быть не абстрактных функций и еще что-то ?
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
27.08.2011, 20:20 #20
BAIZOR, в нём должна быть хотя бы одна чисто виртуальная функция.
0
27.08.2011, 20:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2011, 20:20
Привет! Вот еще темы с решениями:

Расширение языка С. WTF?
Hi, All! Решил на выходных заняться учебой, сессия скоро. На эти выходные...

Спецификация файла. WTF?
Здравствуйте. Что такое спецификация файла (в контексте данной задачи)? В...

Компилятор не компилирует WTF?!
Пишу код, компилирую, все ок, исправил одно значение, компилирую, остается...

map assigment of read only data member или WTF?
задача:из acm.timus.ru 1100. Таблица результатов Ограничение времени: 1.0...


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

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

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