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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Razzeeyy
 Аватар для Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
15.09.2011, 20:45     Вопрос по классам и функциям #1
Здравствуйте, вообщем мне надо реализовать примерно такое дело:
имеется класс the_class
нужно чтобы у каждого экземпляра была разная(собственная) функция допустим class_action

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

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

the_class cat;
the_class monkey;

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

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

C++ вопрос по классам
C++ Вопрос по классам
Вопрос по функциям C++
C++ Вопрос по классам
C++ Вопрос по функциям
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
15.09.2011, 20:54     Вопрос по классам и функциям #2
наверно нужно объявить базовый класс, в нем объявить чисто виртуаьную функцию, унаследовать от
этого класса те 2 и определить виртуальную функцию базового класса в каждом производном
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
15.09.2011, 20:59     Вопрос по классам и функциям #3
Я не уверен полностью, а мб просто использовать для этих целей перегрузку конструктора?
Razzeeyy
 Аватар для Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
15.09.2011, 20:59  [ТС]     Вопрос по классам и функциям #4
а можно простенький пример кода, для наглядности?
*.pwn
Сообщений: n/a
15.09.2011, 21:08     Вопрос по классам и функциям #5
Razzeeyy, Вы хотите иметь 1 класс, но чтобы различные экземпляры (объекты) этого же класса имели разные методы, я правильно Вас понял?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
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;
}
При построении класса вызываются разные функции.
Enfernuz
 Аватар для Enfernuz
22 / 22 / 1
Регистрация: 11.04.2011
Сообщений: 67
15.09.2011, 21:17     Вопрос по классам и функциям #7
Имхо, нужно перегружать конструктор, устанавливая разное значение какой-то переменной для разных "сущностей", а в описании функций с помощью конструкции if или switch по этой переменной описывать соответствующее поведение функции.

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

наверно нужно объявить базовый класс, в нем объявить чисто виртуаьную функцию, унаследовать от
этого класса те 2 и определить виртуальную функцию базового класса в каждом производном
про перегрузку то я и сам знаю, и кстати не поможет там.
Enfernuz
 Аватар для Enfernuz
22 / 22 / 1
Регистрация: 11.04.2011
Сообщений: 67
15.09.2011, 21:30     Вопрос по классам и функциям #10
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Для решения вышеозначенной задачи как раз и предназначены виртуальные функции - тут уже вариант с чистыми виртуальными функциями и наследованием посоветовали. Это решение и есть самое простое и правильное.
Решение с некоей переменной плохое с точки зрения развития. Если виртуальную функцию мы просто добавляем новую для нового типа, не изменяя уже работающий код, то в варианте с переменной придется каждый раз лезть в наш switch и добавлять туда новую ветку проверки.
Я с Вами совершенно согласен
Первый вариант годится разве что для извращенного случая, когда требуется описать разное поведение метода одного-единственного класса, то есть без применения наследования и полиморфизма.
Razzeeyy
 Аватар для Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
15.09.2011, 21:35  [ТС]     Вопрос по классам и функциям #11
я вот не понял...
я пробовал создать просто виртуальный метод в классе, без наследования его от чего либо, компилятор ругнулся что-то вроде "undefined reference to vtable".
а ведь если создавать общий класс и наследовать от него класс с методом, то получается что переменные будут общие для всех "дочерних" классов...
или тогде придеться обьявлять на каждый экземпляр родительский класс, затем для каждого экземпляра создавать "дочерний" класс и описывать функцию
или как это делается?
я не совсем понял...
Enfernuz
 Аватар для 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()
{
   ...
}
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
15.09.2011, 21:45     Вопрос по классам и функциям #13
Razzeeyy, покажи код.
Enfernuz
 Аватар для Enfernuz
22 / 22 / 1
Регистрация: 11.04.2011
Сообщений: 67
15.09.2011, 21:52     Вопрос по классам и функциям #14
Цитата Сообщение от Razzeeyy Посмотреть сообщение
а ведь если создавать общий класс и наследовать от него класс с методом, то получается что переменные будут общие для всех "дочерних" классов...
Да, будут. Ведь производные классы по сути являются "базовым классом с дополнительными фичами".

P.S. Я советую Вам прочитать о наследовании и полиморфизме в какой-нибудь хорошей книге по C++ Тогда многое встанет на свои места.
Razzeeyy
 Аватар для 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);
Enfernuz
 Аватар для Enfernuz
22 / 22 / 1
Регистрация: 11.04.2011
Сообщений: 67
15.09.2011, 22:15     Вопрос по классам и функциям #16
Цитата Сообщение от Razzeeyy Посмотреть сообщение
Посоветуйте какую книжку?
Вот тут ValeryLaptev привел список книг по C++, рекомендуемых к прочтению.
Заметил, что очень многие на этом форуме советуют книгу "Дейтел П.Дж., Дейтел Х.М. Как программировать на С++.".
Сам я недавно освежил в памяти C++ по книге Герберта Шилдта, планирую купить книгу Страуструпа.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
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);
Razzeeyy
 Аватар для Razzeeyy
30 / 7 / 2
Регистрация: 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 ===|
я абсолютно переврал исходный смысл кода?
KING1994
-68 / 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;
    }
Ну названия ты себе переведеш как тебе угодно)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2011, 01:13     Вопрос по классам и функциям
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Razzeeyy
 Аватар для Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
16.09.2011, 01:13  [ТС]     Вопрос по классам и функциям #20
KING1994, спасибо, шас будим разбирацо...
Yandex
Объявления
16.09.2011, 01:13     Вопрос по классам и функциям
Ответ Создать тему
Опции темы

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