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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
#1

Вопрос по классам и функциям - C++

15.09.2011, 20:45. Просмотров 1181. Ответов 25
Метки нет (Все метки)

Здравствуйте, вообщем мне надо реализовать примерно такое дело:
имеется класс the_class
нужно чтобы у каждого экземпляра была разная(собственная) функция допустим class_action

Как это реализовать?

для наглядности что я хочу, примерно:

the_class cat;
the_class monkey;

и вот я хочу чтобы cat и monkey имели метод (или же функцию снаружи им можно было бы передать) который был бы для них свой, т.е. чтобы метод для cat описывался вне класса и метод для monkey описывался вне класса.

p.s. я не силён в терминологии поэтому где то мог неправильно выразиться, но надеюсь вы меня поймете.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2011, 20:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопрос по классам и функциям (C++):

Вопрос по Классам... - C++
#include <iostream> using std::cout; using std::endl; class GradeBook { public: void displayMessage()

Вопрос по классам - C++
Есть такой код #include <iostream> class C1{ public: C1(){std::cout <<" 1 is open"<<std::endl;}; ~C1(){std::cout <<" 1...

Вопрос по классам - C++
Вообщем есть два класса, TTriangular и TPoint. В TTriangular есть метод, который должен вводить координаты заданной точки. В TPoint...

Вопрос по классам - C++
Опишу определение базавого класса и производного class Date { private: ... public: Date( ){}; ...

Вопрос по классам - C++
создал конструктор, который создаёт элемент класса - массив, а вот инициализация данного массива с помощью нового конструктора не...

Вопрос по функциям - C++
Вопрос по функции. мне надо, чтобы моя функция "proverka" принимала значение переменной boo. но на простое присвоение компилятор...

25
PointsEqual
ниначмуроФ
836 / 520 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
15.09.2011, 20:54 #2
наверно нужно объявить базовый класс, в нем объявить чисто виртуаьную функцию, унаследовать от
этого класса те 2 и определить виртуальную функцию базового класса в каждом производном
0
MrGluck
Модератор
Эксперт CЭксперт С++
7496 / 4611 / 694
Регистрация: 29.11.2010
Сообщений: 12,621
15.09.2011, 20:59 #3
Я не уверен полностью, а мб просто использовать для этих целей перегрузку конструктора?
0
Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
15.09.2011, 20:59  [ТС] #4
а можно простенький пример кода, для наглядности?
0
*.pwn
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 1
15.09.2011, 21:08 #5
Razzeeyy, Вы хотите иметь 1 класс, но чтобы различные экземпляры (объекты) этого же класса имели разные методы, я правильно Вас понял?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7496 / 4611 / 694
Регистрация: 29.11.2010
Сообщений: 12,621
15.09.2011, 21:12 #6
Цитата Сообщение от Razzeeyy Посмотреть сообщение
а можно простенький пример кода, для наглядности?
Перегрузка конструктора:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
#include<conio.h>
 
class the_class
{
      public:
             void print1() {std::cout<< "1\n";}
             void print2() {std::cout<< "2\n";}
             void print3() {std::cout<< "3\n";}
             the_class() {print1();}
             the_class(int x) {print2();}
             the_class(int x, int y) {print3();}
};
 
int main()
{
    the_class p1;
    the_class p2(1);
    the_class p3(1, 1);
    getch();
    return 0;
}
При построении класса вызываются разные функции.
0
Enfernuz
22 / 22 / 1
Регистрация: 11.04.2011
Сообщений: 67
15.09.2011, 21:17 #7
Имхо, нужно перегружать конструктор, устанавливая разное значение какой-то переменной для разных "сущностей", а в описании функций с помощью конструкции if или switch по этой переменной описывать соответствующее поведение функции.

А вообще правильнее воспользоваться советом PointsEqual: сделать базовый класс Animal с чисто виртуальным методом, отнаследовать от него Cat и Monkey, описав в них этот виртуальный метод в соответствии с требованиями производного класса.
0
ValeryLaptev
Эксперт С++
1045 / 824 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
15.09.2011, 21:24 #8
Цитата Сообщение от Enfernuz Посмотреть сообщение
Имхо, нужно перегружать конструктор, устанавливая разное значение какой-то переменной для разных "сущностей", а в описании функций с помощью конструкции if или switch по этой переменной описывать соответствующее поведение функции.
Для решения вышеозначенной задачи как раз и предназначены виртуальные функции - тут уже вариант с чистыми виртуальными функциями и наследованием посоветовали. Это решение и есть самое простое и правильное.
Решение с некоей переменной плохое с точки зрения развития. Если виртуальную функцию мы просто добавляем новую для нового типа, не изменяя уже работающий код, то в варианте с переменной придется каждый раз лезть в наш switch и добавлять туда новую ветку проверки.
0
Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
15.09.2011, 21:28  [ТС] #9
Цитата Сообщение от *.pwn Посмотреть сообщение
Razzeeyy, Вы хотите иметь 1 класс, но чтобы различные экземпляры (объекты) этого же класса имели разные методы, я правильно Вас понял?
Да.
______________________________________
Ребят, забыл зацитировать что я просил показать примерным кодом, так это не перегрузку конструктора, а

наверно нужно объявить базовый класс, в нем объявить чисто виртуаьную функцию, унаследовать от
этого класса те 2 и определить виртуальную функцию базового класса в каждом производном
про перегрузку то я и сам знаю, и кстати не поможет там.
0
Enfernuz
22 / 22 / 1
Регистрация: 11.04.2011
Сообщений: 67
15.09.2011, 21:30 #10
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Для решения вышеозначенной задачи как раз и предназначены виртуальные функции - тут уже вариант с чистыми виртуальными функциями и наследованием посоветовали. Это решение и есть самое простое и правильное.
Решение с некоей переменной плохое с точки зрения развития. Если виртуальную функцию мы просто добавляем новую для нового типа, не изменяя уже работающий код, то в варианте с переменной придется каждый раз лезть в наш switch и добавлять туда новую ветку проверки.
Я с Вами совершенно согласен
Первый вариант годится разве что для извращенного случая, когда требуется описать разное поведение метода одного-единственного класса, то есть без применения наследования и полиморфизма.
0
Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
15.09.2011, 21:35  [ТС] #11
я вот не понял...
я пробовал создать просто виртуальный метод в классе, без наследования его от чего либо, компилятор ругнулся что-то вроде "undefined reference to vtable".
а ведь если создавать общий класс и наследовать от него класс с методом, то получается что переменные будут общие для всех "дочерних" классов...
или тогде придеться обьявлять на каждый экземпляр родительский класс, затем для каждого экземпляра создавать "дочерний" класс и описывать функцию
или как это делается?
я не совсем понял...
0
Enfernuz
22 / 22 / 1
Регистрация: 11.04.2011
Сообщений: 67
15.09.2011, 21:45 #12
Что-то вроде этого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Animal
{
    public: virtual void Act() = 0;
};
 
class Monkey : public Animal
{
    public: 
        Monkey();
        virtual void Act();
};
 
Monkey::Monkey()
{
   ...
}
 
void Monkey::Act()
{
   ...
}
 
class Cat : public Animal
{
    public: 
        Cat();
        virtual void Act();
};
 
Cat::Cat()
{
   ...
}
 
void Cat::Act()
{
   ...
}
0
ValeryLaptev
Эксперт С++
1045 / 824 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
15.09.2011, 21:45 #13
Razzeeyy, покажи код.
0
Enfernuz
22 / 22 / 1
Регистрация: 11.04.2011
Сообщений: 67
15.09.2011, 21:52 #14
Цитата Сообщение от Razzeeyy Посмотреть сообщение
а ведь если создавать общий класс и наследовать от него класс с методом, то получается что переменные будут общие для всех "дочерних" классов...
Да, будут. Ведь производные классы по сути являются "базовым классом с дополнительными фичами".

P.S. Я советую Вам прочитать о наследовании и полиморфизме в какой-нибудь хорошей книге по C++ Тогда многое встанет на свои места.
0
Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
15.09.2011, 22:06  [ТС] #15
P.S. Я советую Вам прочитать о наследовании и полиморфизме в какой-нибудь хорошей книге по C++ Тогда многое встанет на свои места.
Посоветуйте какую книжку?

Razzeeyy, покажи код.
Всё равно ниче не даст, нате

Код
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
15.09.2011, 22:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2011, 22:06
Привет! Вот еще темы с ответами:

Вопрос по функциям - C++
Скажите, если у функции в заголовке прописано, что она возвращает значение int: int function(...) { ...} То могу ли я пытаться...

Вопрос по функциям - C++
Есть функция: int fun(char wob, unsigned char s, char name, char opis, uint32_t code) {} Я вызываю её в одном месте приложения: int...

Алюанский вопрос по функциям - C++
Господа и прекрасные дамы...!!! Решил заняться программированием на досуги...книжки умные почитал..примеры освоил.. Но остановился...

Вопрос по функциям класса - C++
class vector { private: double x; double y; double z; public: vector(); vector(double a, double b, double c); ...


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

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

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