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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.88
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
#1

Указатель на метод класса. - C++

25.01.2010, 16:08. Просмотров 1935. Ответов 7
Метки нет (Все метки)

Программа отказывается присваивать метод класса указателю. Как исправить?

Bash
1
2
3
test.cpp: In function ‘int main()’:
test.cpp:66: error: invalid use of non-static member function ‘virtual void Mammal::Speak() const’
test.cpp:67: error: invalid use of non-static member function ‘virtual void Mammal::Move() const’
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
using namespace std;
 
class Mammal
{
    public:
        Mammal(): itsAge(1) { }
        virtual ~Mammal() { }
        virtual void Speak() const = 0;
        virtual void Move() const = 0;
    protected:
        int itsAge;
};
 
class Dog: public Mammal
{
    public:
        void Speak() const { cout << "Woof!\n"; }
        void Move() const { cout << "Walking to heel...\n"; }
};
 
 
class Cat: public Mammal
{
    public:
        void Speak() const { cout << "Meow!\n"; }
        void Move() const { cout << "Slinking...\n"; }
};
 
 
class Horse: public Mammal
{
    public:
        void Speak() const { cout << "Whinny!\n"; }
        void Move() const { cout << "Galloping...\n"; }
};
 
 
int main()
{
    void (Mammal::*pFunc)() const = 0;
    Mammal* ptr = 0;
    int Animal;
    int Method;
    bool fQuit = false;
    
    while(fQuit == false)
    {
        cout << "(0)Quit (1)dog (2)cat (3)horse: ";
        cin >> Animal;
        switch(Animal)
        {
            case 1: ptr = new Dog; break;
            case 2: ptr = new Cat; break;
            case 3: ptr = new Horse; break;
            default: fQuit = true; break;
        }
        if(fQuit)
            break;
        
        cout << "(1)Speak (2)Move: ";
        cin >> Method;
        switch(Method)
        {
            case 1: pFunc = Mammal::Speak; break;
            default: pFunc = Mammal::Move; break;
        }
        
        (ptr->*pFunc)();
        delete ptr;
    }
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2010, 16:08     Указатель на метод класса.
Посмотрите здесь:

Указатель на метод класса в качестве аргумента метода класса - C++
Функция _createFun вызывается для создания ХХХ в основном классе. Но вот потребовалось создать ХХХ в дополнительном классе. Вопрос: как...

Указатель на метод класса - Visual C++
Всем доброе утро! В объявлении класса SignalMathHandler объявляю указатель на метод этого же класса : bool (__thiscall...

Указатель на метод класса - C++
Есть для этого какой-нибудь инструмент? Интересует именно не ссылка, а указатель. Хочется примерно следующего: typedef...

Указатель на метод класса - C++
Как сделать указатель на метод класса А, который наследует класс В в классе В. class A : B { public: double...

Указатель на метод класса - C++
Доброго времени суток, форумчане. Необходимо получить указатель на размер вектора. Делаю из соображений быстродействия, т.к. каждый раз...

Указатель на метод класса! - C++
Ответьте пожалуйста на такой вопрос:Возможна ли такая ситуация и как ее реализовать правильно? Мне надо использовать функцию(void...

Указатель на метод класса - C++
Собственно, проблема вот в чем. Есть класс и для него определен метод class ABC ....... public: void paint(.....); ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
25.01.2010, 16:16     Указатель на метод класса. #2
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
case 1: pFunc = Mammal::Speak; break;
pFunc = &Mammal::Speak;
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
25.01.2010, 16:47  [ТС]     Указатель на метод класса. #3
>> zim22

Спасибо. А как быть в случае с массивами? На этот раз не получается запустить метод класса из массива указателей на методы.

Bash
1
2
test.cpp: In function ‘int main()’:
test.cpp:33: error: expected unqualified-id before ‘*’ token
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
#include <iostream>
using namespace std;
 
class Dog
{
    public:
        void Speak() const { cout << "Woof!\n"; }
        void Move() const { cout << "Walking to heel...\n"; }
        void Eat() const { cout << "Gobbing food...\n"; }
        void Growl() const { cout << "Grrrrr\n"; }
        void Whimper() const { cout << "Whinning noises...\n"; }
        void RollOver() const { cout << "Rolling over...\n"; }
        void PlayDead() const { cout << "Is this the end of Little Caesar?\n"; }
};
 
typedef void (Dog::*PDF)() const;
int main()
{
    const int MaxFuncs = 7;
    PDF DogFunctions[MaxFuncs] =
    {
        &Dog::Speak,
        &Dog::Move,
        &Dog::Eat,
        &Dog::Growl,
        &Dog::Whimper,
        &Dog::RollOver,
        &Dog::PlayDead };
        
    Dog* pDog = new Dog;
    
    for(int i=0; i<7; i++)
        (pDog -> *DogFunctions[i])();
    
    delete pDog;
    
    return 0;
}
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
25.01.2010, 17:11     Указатель на метод класса. #4
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
(pDog -> *DogFunctions[i])();
у тебя пробел между -> и * ? убери его
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
25.01.2010, 17:21  [ТС]     Указатель на метод класса. #5
у тебя пробел между -> и * ? убери его
Нифига себе! Я думал, С++ игнорирует пробелы.
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
25.01.2010, 17:25     Указатель на метод класса. #6
OVERPOWER8,

Нифига себе! Я думал, С++ игнорирует пробелы.


Загадка: одна из этих строчек правильная, другая - нет. Какая где? и почему так, если "С++ игнорирует пробелы. "

i++;
i+ +;
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
25.01.2010, 17:25     Указатель на метод класса. #7
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
Нифига себе! Я думал, С++ игнорирует пробелы.
дело в том, что ->* является оператором
таким же, как +=
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2010, 18:05     Указатель на метод класса.
Еще ссылки по теме:

Указатель на метод класса - C++
Приветствую. Нужна помощь. Не работает указатель в данной программе: #include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; ...

Указатель на метод и на поле класса - C++
Суть такова, нужно создать класс студент, определить метод доступа к скрытым полям уровень знаний и курс. Создать открытое поле стипедия....

Указатель на метод класса (ошибка) - C++
помогите исправить код что бы разобраться в нем) взято с книги и не компилиться. выкидывает ошибку (code::blocks) : &quot;ошибка:...

Аргумент функции - указатель на метод класса - C++
Здравствуйте. Содержание задания - написать программу, создающую копию выбранного пользователем файла при помощи n-го кол-ва потоков...

Шаблон класса двусвязного списка, метод, возвращающий указатель - C++
Пишу шаблон класса двусвязного списка. Всё в хедере. В классе присутствует структура item. Пытаюсь написать метод, возвращающий указатель...


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

Или воспользуйтесь поиском по форуму:
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
25.01.2010, 18:05  [ТС]     Указатель на метод класса. #8
>> zim22

Теперь стало понятно.
Yandex
Объявления
25.01.2010, 18:05     Указатель на метод класса.
Ответ Создать тему
Опции темы

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