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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
#1

error C3867 - C++

16.01.2013, 07:25. Просмотров 2546. Ответов 6
Метки нет (Все метки)

Списал код из учебника. Наверное, там где-то опечатка, так как при компиляции возникает ошибка.
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. Объясните кто понимает, где тут ошибка. (Тема называется "Указатели на функции-члены")
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2013, 07:25     error C3867
Посмотрите здесь:

Ошибка: error C3867 - C++
Всем доброго времени суток. Есть классический пример из книжки: #include &lt;iostream&gt; #include&lt;conio.h&gt; using namespace std; ...

Error C3867: Serpinsky::Display: в вызове функции отсутствует список аргументов - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;GL/Glut.h&gt; #include &lt;locale.h&gt; using namespace std; int level=5 ; //...

error C3867: 'SystemMessages::Work': function call missing argument list - C++
error C3867: 'SystemMessages::Work': function call missing argument list; use '&amp;SystemMessages::Work' to create a pointer to member ...

Error C3867 при вызове функции erase и insert для двумерного вектора - C++
Тренируюсь с использованием контейнера std::vector. Появляется ошибка при удалении и вставке, помогите понять почему и как её исправить.......

Инициализация итератора. Ошибка C3867 - C++
Здравствуйте. Пытаюсь запустить код из учебника Стенли Б.Липпмана стр 154. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Project : error PRJ0003 : Error spawning 'rc.exe - C++
1&gt;Project : error PRJ0003 : Error spawning 'rc.exe'. помогите что за ошибка?

Ошибка: error: 'error' was not declared in this scope - C++
#include &lt;iostream&gt; #include&lt;vector&gt; using namespace std; int area(int a,int b) { if(a&lt;=0 || b&lt;=0) error(&quot;area()...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Schizorb
509 / 461 / 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
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
Pied Piper
232 / 223 / 51
Регистрация: 15.01.2013
Сообщений: 849
Завершенные тесты: 1
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
509 / 461 / 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
Еще ссылки по теме:

Error C2059: syntax error : 'constant' - C++
Подскажите пожалуйста почему выдает ошибку error C2059: syntax error : 'constant' в этой строке : const int OK=0, EOS=0, ERROR=0; ...

[ILINK32 Error] Error: Unresolved external - C++
помогите вылетает ошибка и программа из-за этого не работает! Error: Unresolved external '__fastcall...

Error C2061: syntax error : identifier 'h' - C++
в чем ошибка? error C2061: syntax error : identifier 'h' #include &quot;stdafx.h&quot; #include &quot;stdio.h&quot; #include &quot;conio.h&quot; #include...

Error C2143: syntax error : missing ';' before '.' - C++
#include &lt;fstream&gt; #include &lt;iostream&gt; using std::cin; using std::cout; using std::endl; using std::ifstream; using...

Ошибка в Dev-C++ : Build Error Error 1 - C++
Ошибка в Dev-C++ : Build Error Error 1 Вод сам код: #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace std; ...


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

Или воспользуйтесь поиском по форуму:
Schizorb
509 / 461 / 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
Ответ Создать тему
Опции темы

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