30 / 7 / 0
Регистрация: 01.03.2011
Сообщений: 95
|
|
1 | |
Вопрос по классам и функциям15.09.2011, 20:45. Показов 1801. Ответов 25
Метки нет (Все метки)
Здравствуйте, вообщем мне надо реализовать примерно такое дело:
имеется класс the_class нужно чтобы у каждого экземпляра была разная(собственная) функция допустим class_action Как это реализовать? для наглядности что я хочу, примерно: the_class cat; the_class monkey; и вот я хочу чтобы cat и monkey имели метод (или же функцию снаружи им можно было бы передать) который был бы для них свой, т.е. чтобы метод для cat описывался вне класса и метод для monkey описывался вне класса. p.s. я не силён в терминологии поэтому где то мог неправильно выразиться, но надеюсь вы меня поймете.
0
|
15.09.2011, 20:45 | |
Ответы с готовыми решениями:
25
Вопрос по Классам... Вопрос по классам Вопрос по классам Вопрос по классам |
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
|
|
15.09.2011, 20:54 | 2 |
наверно нужно объявить базовый класс, в нем объявить чисто виртуаьную функцию, унаследовать от
этого класса те 2 и определить виртуальную функцию базового класса в каждом производном
0
|
30 / 7 / 0
Регистрация: 01.03.2011
Сообщений: 95
|
|
15.09.2011, 20:59 [ТС] | 4 |
а можно простенький пример кода, для наглядности?
0
|
*.pwn
|
|
15.09.2011, 21:08 | 5 |
Razzeeyy, Вы хотите иметь 1 класс, но чтобы различные экземпляры (объекты) этого же класса имели разные методы, я правильно Вас понял?
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||||||
15.09.2011, 21:12 | 6 | |||||
Перегрузка конструктора:
0
|
22 / 22 / 2
Регистрация: 11.04.2011
Сообщений: 67
|
|
15.09.2011, 21:17 | 7 |
Имхо, нужно перегружать конструктор, устанавливая разное значение какой-то переменной для разных "сущностей", а в описании функций с помощью конструкции if или switch по этой переменной описывать соответствующее поведение функции.
А вообще правильнее воспользоваться советом PointsEqual: сделать базовый класс Animal с чисто виртуальным методом, отнаследовать от него Cat и Monkey, описав в них этот виртуальный метод в соответствии с требованиями производного класса.
0
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
15.09.2011, 21:24 | 8 |
Для решения вышеозначенной задачи как раз и предназначены виртуальные функции - тут уже вариант с чистыми виртуальными функциями и наследованием посоветовали. Это решение и есть самое простое и правильное.
Решение с некоей переменной плохое с точки зрения развития. Если виртуальную функцию мы просто добавляем новую для нового типа, не изменяя уже работающий код, то в варианте с переменной придется каждый раз лезть в наш switch и добавлять туда новую ветку проверки.
0
|
30 / 7 / 0
Регистрация: 01.03.2011
Сообщений: 95
|
|
15.09.2011, 21:28 [ТС] | 9 |
Да.
______________________________________ Ребят, забыл зацитировать что я просил показать примерным кодом, так это не перегрузку конструктора, а
0
|
22 / 22 / 2
Регистрация: 11.04.2011
Сообщений: 67
|
|
15.09.2011, 21:30 | 10 |
Я с Вами совершенно согласен
Первый вариант годится разве что для извращенного случая, когда требуется описать разное поведение метода одного-единственного класса, то есть без применения наследования и полиморфизма.
0
|
30 / 7 / 0
Регистрация: 01.03.2011
Сообщений: 95
|
|
15.09.2011, 21:35 [ТС] | 11 |
я вот не понял...
я пробовал создать просто виртуальный метод в классе, без наследования его от чего либо, компилятор ругнулся что-то вроде "undefined reference to vtable". а ведь если создавать общий класс и наследовать от него класс с методом, то получается что переменные будут общие для всех "дочерних" классов... или тогде придеться обьявлять на каждый экземпляр родительский класс, затем для каждого экземпляра создавать "дочерний" класс и описывать функцию или как это делается? я не совсем понял...
0
|
22 / 22 / 2
Регистрация: 11.04.2011
Сообщений: 67
|
||||||
15.09.2011, 21:45 | 12 | |||||
Что-то вроде этого:
0
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
15.09.2011, 21:45 | 13 |
Razzeeyy, покажи код.
0
|
22 / 22 / 2
Регистрация: 11.04.2011
Сообщений: 67
|
|
15.09.2011, 21:52 | 14 |
Да, будут. Ведь производные классы по сути являются "базовым классом с дополнительными фичами".
P.S. Я советую Вам прочитать о наследовании и полиморфизме в какой-нибудь хорошей книге по C++ Тогда многое встанет на свои места.
0
|
30 / 7 / 0
Регистрация: 01.03.2011
Сообщений: 95
|
|
15.09.2011, 22:06 [ТС] | 15 |
Код
class Button { public: Button(short pos_x,short pos_y, short button_width, short button_height); void draw(void); void check(void); private: short x,y,width,height; struct btn_color *color; struct btn_color normal; struct btn_color hover; struct btn_color pressed; }; Button gui_A(128,10,125,30);
0
|
22 / 22 / 2
Регистрация: 11.04.2011
Сообщений: 67
|
|
15.09.2011, 22:15 | 16 |
Вот тут ValeryLaptev привел список книг по C++, рекомендуемых к прочтению.
Заметил, что очень многие на этом форуме советуют книгу "Дейтел П.Дж., Дейтел Х.М. Как программировать на С++.". Сам я недавно освежил в памяти C++ по книге Герберта Шилдта, планирую купить книгу Страуструпа.
0
|
15.09.2011, 23:45 | 17 | |||||
На заре моего программирования на Си++ я тоже натыкался на эту ошибку. Именно так я себе представлял виртуальное наследование. Так сделать нельзя. Технически, конечно, можно, работая через указатель на функцию, но идеологически это неправильно. Класс описывает поведение, а экземпляр класса - разновидность. Действие относится к поведению. Поэтому правильно (с точки зрения ООП) в данном случае поступать так:
Построить базовый класс the_class с виртуальным методом, построить два дополнительных (производных) класса tha_cat и the_monkey, в которых переопределять виртуальный метод, и создать два экземпляра cat и monkey Добавлено через 4 минуты Общие по описанию. Но каждый экземпляр будет содержать свои значения. В твоём случае будет что-то типа
0
|
30 / 7 / 0
Регистрация: 01.03.2011
Сообщений: 95
|
||||||
16.09.2011, 00:25 [ТС] | 18 | |||||
Evg, только я там что то не увидел наследования... Сейчас даже откомпилю то, что вы привели, буду разбираться
offtop. вся канитель из-за того что математичка задала написать программу по алгебре для отрисовки косинуса =) отрисовку быстро написал, на openGL, решил заодно сделать gui-велосипедную кнопку на опенгл)) для отображения текста наверно нагуглю какую то библиотеку... Добавлено через 8 минут руководствуясь ошибками компилятора допилил примерный код от Evg вот до такого состояния:
0
|
6 / 6 / 0
Регистрация: 18.07.2011
Сообщений: 77
|
|||||||||||
16.09.2011, 00:59 | 19 | ||||||||||
Вот явный пример виртуальной функции в базовом класе она возвращает куб числа а в наследственном переопределена и возвращает квадрат:
ошыбся в 1-м месте :
0
|
30 / 7 / 0
Регистрация: 01.03.2011
Сообщений: 95
|
|
16.09.2011, 01:13 [ТС] | 20 |
KING1994, спасибо, шас будим разбирацо...
0
|
16.09.2011, 01:13 | |
16.09.2011, 01:13 | |
Помогаю со студенческими работами здесь
20
Вопрос по классам Нужен учебник по стандартным функциям/классам вопрос по классам Вопрос по классам в Фортране Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |