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

error C3867 - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
16.01.2013, 07:25     error C3867 #1
Списал код из учебника. Наверное, там где-то опечатка, так как при компиляции возникает ошибка.
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
74
75
#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 == false)
        {
            cout << "(1)Speak (2)Move: ";
            cin >> Method;
            switch (Method)
            {
            case 1:  pFunc = Mammal::Speak; break;
            default: pFunc = Mammal::Move;  break;
            }
 
            (ptr->*pFunc)();
            delete ptr;
        }
    }
        
    char response;        
    std::cin >> response; 
 
    return 0;     
}
Компилятор пишет:

error C3867: Mammal::Speak: в вызове функции отсутствует список аргументов; используйте "&Mammal::Speak" для создания указателя на член

error C3867: Mammal::Move: в вызове функции отсутствует список аргументов; используйте "&Mammal::Move" для создания указателя на член


И отмечает ошибочными строчки 62 и 63. Объясните кто понимает, где тут ошибка. (Тема называется "Указатели на функции-члены")
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
16.01.2013, 08:50     error C3867 #2
Нужны амперсанды для получения адреса:
C++
1
2
case 1:  pFunc = &Mammal::Speak; break;
default: pFunc = &Mammal::Move;  break;
v.a.l.i.d
 Аватар для v.a.l.i.d
412 / 377 / 10
Регистрация: 21.09.2012
Сообщений: 913
16.01.2013, 14:15     error C3867 #3
Цитата Сообщение от Schizorb Посмотреть сообщение
Нужны амперсанды для получения адреса:
А почему нужны амперсанды? Вроде я где то читал, чтобы получить адрес функции, то ее можно просто записать без круглых скобок
C++
1
2
3
4
5
6
7
8
9
10
11
12
void F()
{
 
}
 
int main()
{
    cout << F << endl;  // печатает адрес функции F()
 
    system("pause");
    return 0;
}
ArmanPrestige
 Аватар для ArmanPrestige
219 / 210 / 50
Регистрация: 15.01.2013
Сообщений: 787
16.01.2013, 14:21     error C3867 #4
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
А почему нужны амперсанды? Вроде я где то читал, чтобы получить адрес функции, то ее можно просто записать без круглых скобок
C++
1
2
3
4
5
6
7
8
9
10
11
12
void F()
{
 
}
 
int main()
{
    cout << F << endl;  // печатает адрес функции F()
 
    system("pause");
    return 0;
}
если попробуете int x = F то получите эррор.
сосздаем типа void* указатель и радуемся
void *x = F;
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
16.01.2013, 15:20     error C3867 #5
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
Вроде я где то читал, чтобы получить адрес функции, то ее можно просто записать без круглых скобок
Для обычных функций да, но тут у нас методы класса. Для них, как правило, нужно явно указывать, что необходим адрес. Хотя, некоторые компиляторы пропускают код и без амперсандов (тут прочитал)

Вообще, запись типа Mammal::Speak, видимо, расценивается как попытка обращения к нестатическому методу класса при отсутствии объекта, поэтому ошибка.
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
16.01.2013, 18:37  [ТС]     error C3867 #6
Цитата Сообщение от Schizorb Посмотреть сообщение
Вообще, запись типа Mammal::Speak, видимо, расценивается как попытка обращения к нестатическому методу класса при отсутствии объекта, поэтому ошибка.
Так а строчки 50, 51, 52 вроде как раз создают объект (в зависимости от введённого числа).

(или нет? ...)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2013, 18:49     error C3867
Еще ссылки по теме:

[ilink32 Error] Error: Unresolved external 'zamena (int * *) ' referenced C++
C++ Error C3867 при вызове функции erase и insert для двумерного вектора
C++ Error LNK1120, error LNK2019, error LNK2028, queue

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

Или воспользуйтесь поиском по форуму:
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
16.01.2013, 18:49     error C3867 #7
Цитата Сообщение от Alex Z Посмотреть сообщение
Так а строчки 50, 51, 52 вроде как раз создают объект
Да, но вот это обращение к методу - Mammal::Speak - происходит не через объект.

У вас, кстати в сообщении компилятора суть ошибки описана, и даже предложено решение проблемы.
Цитата Сообщение от Alex Z Посмотреть сообщение
Mammal::Speak: в вызове функции отсутствует список аргументов; используйте "&Mammal::Speak" для создания указателя на член
Yandex
Объявления
16.01.2013, 18:49     error C3867
Ответ Создать тему
Опции темы

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