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

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

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

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

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

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

the_class cat;
the_class monkey;

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

p.s. я не силён в терминологии поэтому где то мог неправильно выразиться, но надеюсь вы меня поймете.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.09.2011, 20:45
Ответы с готовыми решениями:

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

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

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

25
 Аватар для Enfernuz
22 / 22 / 2
Регистрация: 11.04.2011
Сообщений: 67
16.09.2011, 10:04
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Razzeeyy Посмотреть сообщение
ругается компилятор, но теперь очень экзотично:
В классе the_class нет тела метода method. Нужно описать его, либо пометить метод как чисто виртуальный (virtual void method() = 0; ) -- тогда класс становится чисто виртуальным или абстрактным. Экземпляр такого класса создать нельзя, но от него можно наследовать другие классы.
1
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
16.09.2011, 10:49
Razzeeyy, то, о чём ты говоришь называется интерфейсом. Там же по ссылке есть пример на C++.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
16.09.2011, 12:18
Цитата Сообщение от Razzeeyy Посмотреть сообщение
Evg, только я там что то не увидел наследования...
Забыл написать Я ж просто схематично в воздухе рисовал

Цитата Сообщение от Razzeeyy Посмотреть сообщение
ругается компилятор, но теперь очень экзотично
В базовом классе надо создать тело method'а, а там в моём варианте только описание

Добавлено через 26 секунд
А... в #21 посте всё уже написано

Добавлено через 2 минуты
Только до сути дела ты пока не вник. Весь интерес в концовке:

C++
1
2
3
4
5
6
7
8
9
void call_method (the_class *p)
{
  p->method();
}
 
...
 
call_method (&cat);
call_method (&monkey);
Т.е. после создания экземпляра класса мы указатель преобразуем к указателю на базовый тип и далее нам уже не интересна детализация класса. Мы со всеми производными классами работаем одинаково (через указатель на базовый класс), в точке использования знаем лишь то, что у нас есть method, но не знаем, как он реализован в производных классах. Это и есть главный смысл виртуальности и именно то, что ты хотел получить в самом первом посте. Только технически это делается через тип, а не через экземпляр

Добавлено через 2 минуты
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
#include <iostream>
using namespace std;
 
class the_class
{
  public:
  virtual void method (void){}
};
 
class class_cat: public the_class // ты у себя забыл написать public при наследовании
{
  public:
  virtual void method (void)
  {
    cout << "method for the_class_cat\n";
  }
};
 
class class_monkey: public the_class // ты у себя забыл написать public при наследовании
{
  public:
  virtual void method (void)
  {
    cout << "method for the_class_monkey\n";
  }
};
 
class_cat cat;
class_monkey monkey;
 
void call_method (the_class *p)
{
  // Здесь мы работаем с базовым классом, не зная о том, как конкретно
  // будет работать method для нашего экземпляра
  p->method();
}
 
int main()
{
  call_method (&cat);
  call_method (&monkey);
}
Добавлено через 7 минут
В качестве задания можешь попробовать создать следующую систему. Класс "фигура", содержит виртуальный метод "нарисовать по таким-то координатам". Производные классы "квадрат" и "круг", переопределяют виртуальный метод. Далее создать массив указателей на экземпляры "фигура" (понятное дело, туда подложить круги и квдраты) и далее этот массив отобразить на экран по рандомным координатам, работая, разумеется, строго как с "фигурой".

Т.е. у тебя есть как бы библиотека, которая поставляет "фигуру" и некие утилиты к ней (в нашем случае это прорисовать массив фигур). А есть пользовательская программа, которая на базе "фигуры" создаёт "квадрат" и "круг" и далее пользуется кодами из библиотек, а сама программа делает только минимум вещей
1
 Аватар для Razzeeyy
30 / 7 / 0
Регистрация: 01.03.2011
Сообщений: 95
16.09.2011, 13:01  [ТС]
Enfernuz. спасибо.

Только до сути дела ты пока не вник. Весь интерес в концовке:
Evg, да немного не вник))
Да мне пока это и не нужно, у меня всё равно будет внутри класса метод вызываться локально. Мне виртуальный метод нужен для того чтобы каждая кнопка при клике вела себя по разному, а отрисовку и проверку "состояния" кнопки берут на себя обычные методы класса.

P.S. кстати какой то интересный артефакт с кнопкой... когда указатель на неё наводишь (она у меня меняет цвет) то перерисовываетсся с артефактами, как будто без вертикальной синхронизации.
0
ниначмуроФ
 Аватар для PointsEqual
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
16.09.2011, 14:19
Цитата Сообщение от Evg Посмотреть сообщение
virtual void method (void){}
нужно сделать чисто виртуальной, ведь ТС нужно "нужно чтобы у каждого экземпляра была разная(собственная) функция"
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
16.09.2011, 15:11
Цитата Сообщение от PointsEqual Посмотреть сообщение
нужно сделать чисто виртуальной, ведь ТС нужно "нужно чтобы у каждого экземпляра была разная(собственная) функция"
Ну это уже зависит от конкретики и реализации. ТС просто в общих чертах вопрос задал. Его больше интересовала техническая сторона вопроса, чем концептуальная
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.09.2011, 15:11

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru