Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2009, 19:43   #1
ezus
Пользователь
 
Регистрация: 08.05.2009
Сообщений: 78
По умолчанию Передача функции как параметра

Здравствуйтие!

Не могу понять в где ошибка.
Мне надо передать функцию как параметр (делегировать).

Вот что я сделал:

Описание функции:
1. In A.h файле

double getGoalFunctionValue( double* point );

2. В А.сс файле

double А::getGoalFunctionValue( double* point ){

Использование:
1. In В.h файле

int run( double (*ff)(double*) );

2. В В.сс файле

int В::run( double (*ff)(double*) ) {

3. Вызов из объекта класса А
if(b.run(getGoalFunctionValue) != 0)


И вот что получаю при компиляции:

В.cpp(168) : error C2664: 'run' : cannot convert parameter 1 from 'double (double *)' to 'double (__cdecl *)(double *)'

Подскажите, пожалуйста, в чем ошибка.

Спасибо.
ezus вне форума Ответить с цитированием
Старый 23.08.2009, 20:54   #2
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

както вы расплывчисто вопрос задали..
можно так
Код:
#include <iostream>

double foo1 (double *arr){
	return arr[0];
}
double foo2 (double *arr){
	return arr[1];
}

typedef double (*ptr_func)(double*);

void foo(ptr_func f, double *arr){
	std::cout << f(arr) << std::endl;
}
int main()
{
	double arr[] = {1,2,3,4};
	foo(&foo1, arr);
	foo(&foo2, arr);
	return 0;
}
если double getGoalFunctionValue( double* point ); это метод класса то
я бы такое решение предложил (и то я так и не понял что вы именно хотите сделать)
Код:
#include <iostream>
#include <boost/function.hpp>

class Employee{
public:
	double getGoalFunctionValue( double* point );
};

double Employee::getGoalFunctionValue(double *point){
	return point[0];
} 

class Foo{
public:
	void run(boost::function<double (Employee*, double*)>  &func , Employee *e);
};

void Foo::run(boost::function<double (Employee*, double*)> &func, Employee *e){
	double arr[] = {9,8,7};
	std::cout << func(e, arr) << std::endl;
}
int main()
{
	boost::function<double (Employee *, double*)> f;
	Foo fx;
	Employee e;
	f = &Employee::getGoalFunctionValue;
	fx.run(f, &e);
	return 0;
}
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 24.08.2009, 10:19   #3
ezus
Пользователь
 
Регистрация: 08.05.2009
Сообщений: 78
По умолчанию

Спасибо.
Уточнение:
Функция int В::run( double (*ff)(double*) ) вызывается из нескольких мест с передачей параметра call-back функции, предназначенной для вычисления значения конкретного вырожения.

Я не знаком с #include <boost/function.hpp>, в чем смысл использовать boost. Разве нельзя ограничиться только функциональностью С++?
ezus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача имени класса как параметра Квэнди Общие вопросы Delphi 14 06.04.2009 20:09
Функции. Передача массива в качестве параметра функции. Wia Помощь студентам 2 17.03.2009 14:57
Передача строки-как параметра-переменной Иллидан Общие вопросы Delphi 13 03.10.2008 18:40
Передача компонента как параметра в функцию hayhay Microsoft Office Excel 1 11.03.2008 15:53