Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
30 / 7 / 0
Регистрация: 01.03.2011
Сообщений: 95
1

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

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

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

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

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

the_class cat;
the_class monkey;

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

p.s. я не силён в терминологии поэтому где то мог неправильно выразиться, но надеюсь вы меня поймете.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.09.2011, 20:45
Ответы с готовыми решениями:

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

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

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

Вопрос по классам
Опишу определение базавого класса и производного class Date { private: ... ...

25
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
15.09.2011, 20:54 2
наверно нужно объявить базовый класс, в нем объявить чисто виртуаьную функцию, унаследовать от
этого класса те 2 и определить виртуальную функцию базового класса в каждом производном
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
15.09.2011, 20:59 3
Я не уверен полностью, а мб просто использовать для этих целей перегрузку конструктора?
0
30 / 7 / 0
Регистрация: 01.03.2011
Сообщений: 95
15.09.2011, 20:59  [ТС] 4
а можно простенький пример кода, для наглядности?
0
*.pwn
15.09.2011, 21:08 5
Razzeeyy, Вы хотите иметь 1 класс, но чтобы различные экземпляры (объекты) этого же класса имели разные методы, я правильно Вас понял?
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
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
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
Цитата Сообщение от Enfernuz Посмотреть сообщение
Имхо, нужно перегружать конструктор, устанавливая разное значение какой-то переменной для разных "сущностей", а в описании функций с помощью конструкции if или switch по этой переменной описывать соответствующее поведение функции.
Для решения вышеозначенной задачи как раз и предназначены виртуальные функции - тут уже вариант с чистыми виртуальными функциями и наследованием посоветовали. Это решение и есть самое простое и правильное.
Решение с некоей переменной плохое с точки зрения развития. Если виртуальную функцию мы просто добавляем новую для нового типа, не изменяя уже работающий код, то в варианте с переменной придется каждый раз лезть в наш switch и добавлять туда новую ветку проверки.
0
30 / 7 / 0
Регистрация: 01.03.2011
Сообщений: 95
15.09.2011, 21:28  [ТС] 9
Цитата Сообщение от *.pwn Посмотреть сообщение
Razzeeyy, Вы хотите иметь 1 класс, но чтобы различные экземпляры (объекты) этого же класса имели разные методы, я правильно Вас понял?
Да.
______________________________________
Ребят, забыл зацитировать что я просил показать примерным кодом, так это не перегрузку конструктора, а

наверно нужно объявить базовый класс, в нем объявить чисто виртуаьную функцию, унаследовать от
этого класса те 2 и определить виртуальную функцию базового класса в каждом производном
про перегрузку то я и сам знаю, и кстати не поможет там.
0
22 / 22 / 2
Регистрация: 11.04.2011
Сообщений: 67
15.09.2011, 21:30 10
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Для решения вышеозначенной задачи как раз и предназначены виртуальные функции - тут уже вариант с чистыми виртуальными функциями и наследованием посоветовали. Это решение и есть самое простое и правильное.
Решение с некоей переменной плохое с точки зрения развития. Если виртуальную функцию мы просто добавляем новую для нового типа, не изменяя уже работающий код, то в варианте с переменной придется каждый раз лезть в наш switch и добавлять туда новую ветку проверки.
Я с Вами совершенно согласен
Первый вариант годится разве что для извращенного случая, когда требуется описать разное поведение метода одного-единственного класса, то есть без применения наследования и полиморфизма.
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
Что-то вроде этого:
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
Эксперт С++
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
Цитата Сообщение от Razzeeyy Посмотреть сообщение
а ведь если создавать общий класс и наследовать от него класс с методом, то получается что переменные будут общие для всех "дочерних" классов...
Да, будут. Ведь производные классы по сути являются "базовым классом с дополнительными фичами".

P.S. Я советую Вам прочитать о наследовании и полиморфизме в какой-нибудь хорошей книге по C++ Тогда многое встанет на свои места.
0
30 / 7 / 0
Регистрация: 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
22 / 22 / 2
Регистрация: 11.04.2011
Сообщений: 67
15.09.2011, 22:15 16
Цитата Сообщение от Razzeeyy Посмотреть сообщение
Посоветуйте какую книжку?
Вот тут ValeryLaptev привел список книг по C++, рекомендуемых к прочтению.
Заметил, что очень многие на этом форуме советуют книгу "Дейтел П.Дж., Дейтел Х.М. Как программировать на С++.".
Сам я недавно освежил в памяти C++ по книге Герберта Шилдта, планирую купить книгу Страуструпа.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
15.09.2011, 23:45 17
Цитата Сообщение от Razzeeyy Посмотреть сообщение
Здравствуйте, вообщем мне надо реализовать примерно такое дело:
имеется класс the_class
нужно чтобы у каждого экземпляра была разная(собственная) функция допустим class_action

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

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

the_class cat;
the_class monkey;

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

p.s. я не силён в терминологии поэтому где то мог неправильно выразиться, но надеюсь вы меня поймете.
На заре моего программирования на Си++ я тоже натыкался на эту ошибку. Именно так я себе представлял виртуальное наследование. Так сделать нельзя. Технически, конечно, можно, работая через указатель на функцию, но идеологически это неправильно. Класс описывает поведение, а экземпляр класса - разновидность. Действие относится к поведению. Поэтому правильно (с точки зрения ООП) в данном случае поступать так:

Построить базовый класс the_class с виртуальным методом, построить два дополнительных (производных) класса tha_cat и the_monkey, в которых переопределять виртуальный метод, и создать два экземпляра cat и monkey

Добавлено через 4 минуты
Цитата Сообщение от Razzeeyy Посмотреть сообщение
а ведь если создавать общий класс и наследовать от него класс с методом, то получается что переменные будут общие для всех "дочерних" классов...
Общие по описанию. Но каждый экземпляр будет содержать свои значения.

В твоём случае будет что-то типа

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
class the_class
{
  virtual void method (void);
};
 
class the_class_cat
{
  virtual void method (void)
  {
    cout << "method for the_class_cat";
  }
};
 
class the_class_monkey
{
  virtual void method (void)
  {
    cout << "method for the_class_monkey";
  }
};
 
void call_method (the_class *p)
{
  p->method();
}
 
the_class_cat cat;
the_class_monkey monkey;
 
call_method (&cat);
call_method (&monkey);
0
30 / 7 / 0
Регистрация: 01.03.2011
Сообщений: 95
16.09.2011, 00:25  [ТС] 18
Evg, только я там что то не увидел наследования... Сейчас даже откомпилю то, что вы привели, буду разбираться

offtop. вся канитель из-за того что математичка задала написать программу по алгебре для отрисовки косинуса =) отрисовку быстро написал, на openGL, решил заодно сделать gui-велосипедную кнопку на опенгл))
для отображения текста наверно нагуглю какую то библиотеку...

Добавлено через 8 минут
руководствуясь ошибками компилятора допилил примерный код от Evg вот до такого состояния:

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
#include <iostream>
using namespace std;
 
class the_class
{
  public:
  virtual void method (void);
};
 
class class_cat:the_class
{
  public:
  virtual void method (void)
  {
    cout << "method for the_class_cat";
  }
};
 
class class_monkey:the_class
{
  public:
  virtual void method (void)
  {
    cout << "method for the_class_monkey";
  }
};
 
class_cat cat;
class_monkey monkey;
 
int main()
{
    cat.method();
    monkey.method();
}
ругается компилятор, но теперь очень экзотично:
obj/Debug/main.o||In function `the_class':|
/home/razzeeyy/workspace/codeblocks/e-olimp/main.cpp|4|undefined reference to `vtable for the_class'|
obj/Debug/main.o.rodata._ZTI12class_monkey[typeinfo for class_monkey]+0x10)||undefined reference to `typeinfo for the_class'|
obj/Debug/main.o.rodata._ZTI9class_cat[typeinfo for class_cat]+0x10)||undefined reference to `typeinfo for the_class'|
||=== Build finished: 3 errors, 0 warnings ===|
я абсолютно переврал исходный смысл кода?
0
6 / 6 / 0
Регистрация: 18.07.2011
Сообщений: 77
16.09.2011, 00:59 19
Вот явный пример виртуальной функции в базовом класе она возвращает куб числа а в наследственном переопределена и возвращает квадрат:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "stdafx.h"
#include<conio.h>
#include<iostream>
using namespace std;
class Cclass
{
private:int m_count;
public:
Cclass()//конструктор по умолчанию
{
m_count=0;
};
Cclass(int a)//конструктор с параметрами
{
m_count=a;
};
Cclass(Cclass &o)//конструктор копирования
{
m_count=o.m_count;
}
virtual int rezult(int a)
{
m_count=a*a*a;
return m_count;
}
virtual ~Cclass(){};//деструктор
};
class Child:public Cclass
{
private:
    int m_num;
public:
    Child()//потомственный конструктор по умолчанию
    {
        Cclass();
        m_num=0;
    }
    Child(int a)//потомственный конструктор с параметрами.Конструктор копирования описывать не буду уже.
    {
        Cclass();
        m_num=a;
    }
virtual int rezult(int a)
    {
        return a*a;
    }
virtual ~Child(){};//потомственный деструктор
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    Cclass p;cout<<p.rezult(2)<<endl;
    Child s;cout<<s.rezult(2)<<endl;
    getch();
    return 0;
}
Добавлено через 4 минуты
ошыбся в 1-м месте :
C++
1
2
3
4
5
virtual int rezult(int a)
    {
        Cclass::rezult(a);
        return a*a;
    }
Ну названия ты себе переведеш как тебе угодно)
0
30 / 7 / 0
Регистрация: 01.03.2011
Сообщений: 95
16.09.2011, 01:13  [ТС] 20
KING1994, спасибо, шас будим разбирацо...
0
16.09.2011, 01:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.09.2011, 01:13
Помогаю со студенческими работами здесь

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

Нужен учебник по стандартным функциям/классам
Нужен учебник по стандартным функциям/классам C и C++, Борланд С++ буилдер, etc на русском....

вопрос по классам
Задание состоит в том, что создается класс для работы с векторами, одна из функций должна выполнять...

Вопрос по классам в Фортране
А можно попросить Вас хотя бы немножко помочь в описании данной программы? Мне нужно создать класс...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru