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

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

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

error C3867 - C++

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

Ошибка: 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...

Исправить ошибку в WxDev-C++: Error with debugging process: GDB Error: error, No source file named main.cpp - C++
Здравствуйте товарищи! Новенький я в си, установил wxDev-C++, скомпилировал, запускаешь - работает, а чтоб пошагово отладка - не...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
16.01.2013, 08:50 #2
Нужны амперсанды для получения адреса:
C++
1
2
case 1:  pFunc = &Mammal::Speak; break;
default: pFunc = &Mammal::Move;  break;
2
v.a.l.i.d
413 / 378 / 10
Регистрация: 21.09.2012
Сообщений: 913
16.01.2013, 14:15 #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;
}
0
ArmanPrestige
Pied Piper
232 / 223 / 51
Регистрация: 15.01.2013
Сообщений: 849
Завершенные тесты: 1
16.01.2013, 14:21 #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;
0
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
16.01.2013, 15:20 #5
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
Вроде я где то читал, чтобы получить адрес функции, то ее можно просто записать без круглых скобок
Для обычных функций да, но тут у нас методы класса. Для них, как правило, нужно явно указывать, что необходим адрес. Хотя, некоторые компиляторы пропускают код и без амперсандов (тут прочитал)

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

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

У вас, кстати в сообщении компилятора суть ошибки описана, и даже предложено решение проблемы.
Цитата Сообщение от Alex Z Посмотреть сообщение
Mammal::Speak: в вызове функции отсутствует список аргументов; используйте "&Mammal::Speak" для создания указателя на член
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2013, 18:49
Привет! Вот еще темы с ответами:

Error LNK1120, error LNK2019, error LNK2028, queue - C++
// свойство класса Parser queue&lt;elem*&gt;* postfix = new queue&lt;elem*&gt;; // строка, из-за которой происходит ошибка ...

Ошибка в тестовом примере: "Error 1 error C2143: syntax error : missing ';' before 'if'" - C++
#include&lt;iostream&gt; using namespace std; int main(){ int x, a = 0, b = 10; (cin &gt;&gt; x).get(); while (x){ int c = x % 10; ...

Error 1 error C2664: 'CharToOemW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR' - C++
выдает вот такую ошибку - Error 1 error C2664: 'CharToOemW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR' использую visual...

Причина ошибки [ilink32 Error] Error: Unable to perform link - C++
Когда сохранил программу и пытаюсь открыть ее снова то мне выкидывает ошибку Warning: Error detected (LME288) Error: Unable to...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.01.2013, 18:49
Ответ Создать тему
Опции темы

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