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

CALLBACK. Нужна помощь - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
atomohod
 Аватар для atomohod
20 / 20 / 1
Регистрация: 01.04.2010
Сообщений: 57
06.11.2011, 21:52     CALLBACK. Нужна помощь #1
Всем привет!

Есть такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class ExpressionCalculator
{
private:
    double(ExpressionCalculator::*fn)(double,double,double,double);
public:
    ExpressionCalculator(void);
    ~ExpressionCalculator(void);
 
    double f1(double a, double b, double c, double d);
    double f2(double a, double b, double c, double d);
    double f3(double a, double b, double c, double d);
 
    double Calculate(double a, double b, double c, double d);
 
};
в *.cpp пробую:
C++
1
2
3
4
5
double ExpressionCalculator::Calculate(double a, double b, double c, double d)
{
    double tmp = fn(a,b,c,d);
    return tmp;
}
на
C++
1
double tmp = fn(a,b,c,d);
получаю при компиляции

error C2064: результатом вычисления фрагмента не является функция, принимающая 4 аргументов

подскажите, что не так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2011, 21:52     CALLBACK. Нужна помощь
Посмотрите здесь:

C++ НУЖНА ПОМОЩЬ В С++
C++ Нужна помощь.
C++ Нужна помощь
Нужна помощь C++
C++ Нужна помощь
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
07.11.2011, 22:21     CALLBACK. Нужна помощь #21
Bers, да ничего не заменится. Вызов функции произойдёт точно так же, как и при вызове непосредственно через идентификатор, командой call.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
07.11.2011, 22:24     CALLBACK. Нужна помощь #22
Цитата Сообщение от silent_1991 Посмотреть сообщение
Bers, да ничего не заменится. Вызов функции произойдёт точно так же, как и при вызове непосредственно через идентификатор, командой call.
Вы понимаете, что вы сейчас общаетесь с программистом на с++, а не на ассемблере.
Вы затронули тему того, что программисту с++ нужно знать низкоуровневую механику процессов.

Но это же не значит, что ему нужно знать ассемблер? Вы можете изъясняться в терминах с++, а не ассемблера?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
07.11.2011, 22:31     CALLBACK. Нужна помощь #23
Bers, чтобы вам понять, в чём вы ошиблись (ну или приврали), вам надо понять, что на уровне ассемблера уже нет никаких идентификаторов, только чистые адреса. Вызов функции происходит как передача управления на начало кода по адресу этой функции (грубо, без учёта подготовки стека, передачи параметров и т.д.). Так вот, вызов функции по идентификатору - передача управления по адресу функции. Вызов функции по указателю - то же самое, ведь предварительно в указатель был записан адрес начала функции. В конечном итоге и при вызове функции через идентификатор, и при вызове через указатель произойдёт передача управления в одно и то же место. Компилятор ничего текстово заменять не будет.

Добавлено через 39 секунд
Сразу хочу оговориться, что я не очень компетентен в ассемблере, поэтому в тонкостях могу ошибаться. Но сама идея такая, как я описал.
Bers
Заблокирован
07.11.2011, 22:40     CALLBACK. Нужна помощь #24
ну дык, именно это же я и предполагал! Но поскольку с++ более верхний язык, я заменил понятие "адрес исполняемого кода" на "идентификатор функции"

А Идентификатор функции, и её имя - суть одно и тоже!
компилятор сам подставит вместо имени идентификатор (адрес)
компилятор сам подставит вместо идентификатора адрес (как в случае с указателем на функ)

Точно так же, как имя переменной и идентификатор переменной - одно и тоже (тоже на самом деле указатели на память, где лежат данные)

Добавлено через 3 минуты
тип переменной сообщают компилятору "какая структура данных ожидается"
А имя переменной - адрес, по которому эта структура живёт.


Если речь о переменной, которая хранит указатель на функцию, то значение переменной - адрес, по которому живет исполняемый код.

Обратишься к имени такой переменной - запустишь этот код
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
07.11.2011, 23:13     CALLBACK. Нужна помощь #25
Bers, идентификатор - не адрес. Именно поэтому я и решил внести свои пять копеек. Просто неверно говорить, что компилятор заменит вызов через указатель на вызов через идентификатор.
Bers
Заблокирован
07.11.2011, 23:15     CALLBACK. Нужна помощь #26
Цитата Сообщение от silent_1991 Посмотреть сообщение
Bers, идентификатор - не адрес. Именно поэтому я и решил внести свои пять копеек. Просто неверно говорить, что компилятор заменит вызов через указатель на вызов через идентификатор.
ну так раскройте тему. И расскажите что почем.
Но имейте ввиду - раскрывать тему придётся приплюснутым, а не ассемблистам.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
07.11.2011, 23:30     CALLBACK. Нужна помощь #27
Bers, да чего раскрывать-то? Я уже всё сказал. Идентификатор - текстовое имя. Именно с точки зрения высокого уровня. Потому что никаких текстовых имён на низком уровне нет. И с точки зрения высокого уровня компилятор ничего ни на что не заменяет. А чтобы говорить о том, что же всё-таки он делает, придётся вертеться уже в низком уровне.

 Комментарий модератора 
Bers, а теперь закончили. Я достаточно почитал обсуждений с вашим участием, чтобы понять, что вам нужен спор ради спора. Вы говорите о высоком уровне, рассуждая в терминах низкого. Высокий уровень - std::function, низкий уровень - указатели на функции. И пока вы будете говорить, что компилятор заменяет вызов через указатель на вызов через имя, ссылаясь на высокий уровень, вы просто-напросто будете перевирать термины.
Bers
Заблокирован
07.11.2011, 23:39     CALLBACK. Нужна помощь #28
тему раскрыть в состоянии?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2011, 23:49     CALLBACK. Нужна помощь
Еще ссылки по теме:

Нужна помощь C++
C++ Нужна помощь
For_each и аргументы callback-функции; Как передать callback'у больше одного аргумента C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
07.11.2011, 23:49     CALLBACK. Нужна помощь #29
Bers, тема раскрыта уже раза 3. Так что да, в состоянии, как можно было догадаться. Мало того, что я в состоянии раскрыть тему, так я ещё и в состоянии её закрыть, поскольку вы, как обычно, начинаете разводить флейм. Так что...

 Комментарий модератора 
ТС доволен, тема закрыта.
Yandex
Объявления
07.11.2011, 23:49     CALLBACK. Нужна помощь
Закрытая тема Создать тему
Опции темы

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