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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 19:49     ООП + полиморфизм = wtf? #1
Есть:
Класс A - отец
Класс Б - дочерний
Класс Ц - дочерный, наследуеться от А(сестра Б)

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

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

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

ООП Полиморфизм Наследование C++
Очередное WTF ))) C++
Расширение языка С. WTF? C++
Спецификация файла. WTF? C++
Подкиньте практику по ООП + полиморфизм + шаблоны пожалуйста. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.08.2011, 19:53     ООП + полиморфизм = wtf? #2
В цикле, вестимо.
ЛеЖиК)
 Аватар для ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 630
27.08.2011, 19:54     ООП + полиморфизм = wtf? #3
C++
1
2
for(int i=0;i<100;i++)
     Mass[i].f();
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.08.2011, 19:57     ООП + полиморфизм = wtf? #4
Только выглядеть это должно бы
C++
1
Mass[i]->f();
а функция f() должна быть виртуальной.
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:04  [ТС]     ООП + полиморфизм = wtf? #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
Bers
Заблокирован
27.08.2011, 20:07     ООП + полиморфизм = wtf? #6
ну он вам пишет, что объект пытается использовать функцию, у которой отсутствует тело.

C++
1
2
3
4
void setStatus(LPVOID Object,int newstatus)
{
....
}
Надо ж ещё указывать имя класса, к которому эта функция относится
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.08.2011, 20:09     ООП + полиморфизм = wtf? #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 Посмотреть сообщение
Надо ж ещё указывать имя класса, к которому эта функция относится
Да у него эта функция для "дитя". Внутри определения класса.
Mr.X
Эксперт С++
 Аватар для Mr.X
2796 / 1572 / 246
Регистрация: 03.05.2010
Сообщений: 3,648
27.08.2011, 20:09     ООП + полиморфизм = wtf? #8
Цитата Сообщение от BAIZOR Посмотреть сообщение
Есть:
Класс A - отец
Класс Б - дочерний
Класс Ц - дочерный, наследуеться от А(сестра Б)
Есть массив типа А, с названием Mass.
Он хранит в себе объекты классов Б и Ц.
в классе Б есть функция F().
в классе Ц есть функция F() (отличающаяся функционалом).
Внамание! Вопрос:
как провернуть такую часть кода - Mass[0..100].F();
Ну, во-первых не массив, а вектор, во-вторых не типа А, а типа А*,
ну и, в третьих, нужно воспользоваться алгоритмом for_each.
Bers
Заблокирован
27.08.2011, 20:10     ООП + полиморфизм = wtf? #9
/зы

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

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

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

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

Не по теме:

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

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

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

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

Не по теме:

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

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

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

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

А класс Б, как потомок класса А - лишь конкретные реализации виртуальных методов класса А.
И тогда все будит нормально.
Сыроежка
Заблокирован
27.08.2011, 20:16     ООП + полиморфизм = wtf? #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.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.08.2011, 20:18     ООП + полиморфизм = wtf? #18
Цитата Сообщение от BAIZOR Посмотреть сообщение
UI == Mass

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




Я уже понял все, только одного не знаю - как сделать класс Абстрактным, я давненько это делал... в нем не может быть не абстрактных функций и еще что-то ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2011, 20:20     ООП + полиморфизм = wtf?
Еще ссылки по теме:

ООП. Полиморфизм C++
C++ map assigment of read only data member или WTF?
C++ Полиморфизм инкапсуляция и наследование(ООП)

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.08.2011, 20:20     ООП + полиморфизм = wtf? #20
BAIZOR, в нём должна быть хотя бы одна чисто виртуальная функция.
Yandex
Объявления
27.08.2011, 20:20     ООП + полиморфизм = wtf?
Ответ Создать тему
Опции темы

Текущее время: 02:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru