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

C++

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

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

25.01.2010, 16:08. Просмотров 1906. Ответов 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
2336 / 1051 / 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++
Указатель на метод класса C++
Шаблон класса двусвязного списка, метод, возвращающий указатель C++
Как сделать указатель/ссылку на метод конкретного экземпляра класса C++
Указатель на this в конструкторе класса C++

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

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

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

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