Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / как передать указатель на функцию? / 25 сообщений из 27, страница 1 из 2
18.11.2013, 16:49
    #38468850
Garfish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
как передать функцию через указатель
выдает ошибку
Код: plaintext
1.
2.
error C2440: '=' : cannot convert from ' [code=plaintext]
double (__thiscall ClassB::*)(int)' to 'double (__cdecl *)(int)

'
кто сталкивался подскажите как исправить
Код: plaintext
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.
class ClassA
{
public:
	typedef double (*CFunc)(int t1);// Call-Back функция 
	CFunc Func;
};

class ClassB
{
public:
	double BFunc(int t);
};

double ClassB::BFunc(int t)
{
	return t*3;
}

double MFunc(int t)
{
	return t*2;
}

int main(int argc, char* argv[])
{
	ClassA A;
	A.Func=MFunc;
	double t1=A.Func(10);// работает результат 20

	ClassB B;
	A.Func=B.BFunc;
	double t2=A.Func(10);// не работает, результат д.б. 30

	return 0;
}
...
Рейтинг: 0 / 0
18.11.2013, 18:40
    #38469022
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
Garfish,

Ты пытаешься передать через указатель на функцию указатель на нестатическую функцию-член.
У них разные сигнатуры физически, и кроме этого в С++ это разные типы данных, неприводимые друг к другу.

Если тебе нужно передавать указатель на такую функцию:

Код: plaintext
1.
typedef double (*CFunc)(int t1);



и она должна быть функцией класса (методом), то эта функция должна быть статической,
т.е. не иметь неявного параметра this.
...
Рейтинг: 0 / 0
18.11.2013, 18:48
    #38469035
Garfish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
MasterZiv,

это для меня новое можешь показать как должена выглядеть статическая функцией класса (методом) без this
...
Рейтинг: 0 / 0
18.11.2013, 18:51
    #38469038
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
Код: plaintext
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.
class ClassA
{
public:
	typedef double (*CFunc)(int t1);// Call-Back функция 
	CFunc Func;
};

class ClassB
{
public:
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!
static double BFunc(int t);
};

double ClassB::BFunc(int t)
{
	return t*3;
}

double MFunc(int t)
{
	return t*2;
}

int main(int argc, char* argv[])
{
	ClassA A;
	A.Func=MFunc;
	double t1=A.Func(10);// работает результат 20

	ClassB B;
	A.Func=B.BFunc;
	double t2=A.Func(10);// не работает, результат д.б. 30

	return 0;
}
...
Рейтинг: 0 / 0
18.11.2013, 18:55
    #38469044
Garfish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
MasterZiv,

спасибо,
...
Рейтинг: 0 / 0
18.11.2013, 19:37
    #38469093
Garfish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
MasterZiv,

а как уйти от static, я сделал у меня в эту функцию статик она требует и входящие в этй функции и переменные сделать тоже типом статик,
а на переменные в классе тоже ругается
illegal reference to data member 'ClassB::s' in a static member function
...
Рейтинг: 0 / 0
18.11.2013, 19:50
    #38469108
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
GarfishMasterZiv,

а как уйти от static, я сделал у меня в эту функцию статик она требует и входящие в этй функции и переменные сделать тоже типом статик,
а на переменные в классе тоже ругается
illegal reference to data member 'ClassB::s' in a static member function

В функцию не могут входить функции. Я ничего не понимаю.

Код полностью и тексты ошибок.
...
Рейтинг: 0 / 0
18.11.2013, 19:52
    #38469111
Garfish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
MasterZiv,

Код: plaintext
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.
{
public:
	typedef double (*CFunc)(int );// Call-Back функция
	CFunc Func;	
};

class ClassB
{
public:
	static double BFunc(int t);	
	static void F2(int C1);
	int s;
};

void ClassB::F2(int C1)
{
	s=s+0;
}

double ClassB::BFunc(int t)
{
	F2(t);
	return t*3;
}

double MFunc(int t)
{
	return t*2;
}

int main(int argc, char* argv[])
{

	ClassA A;
	A.Func=MFunc;
	double t1=A.Func(10);// работает

	ClassB B;
	A.Func=B.BFunc;
	double t2=A.Func(10);

	return 0;
}
...
Рейтинг: 0 / 0
18.11.2013, 19:53
    #38469112
Garfish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
ругается на s
error C2597: illegal reference to data member 'ClassB::s' in a static member function
...
Рейтинг: 0 / 0
18.11.2013, 19:55
    #38469116
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
Garfish,

это невалидный код. с 1-ой строчки.
...
Рейтинг: 0 / 0
18.11.2013, 19:56
    #38469117
Garfish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
MasterZiv,

Код: plaintext
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.
class ClassA
{
public:
	typedef double (*CFunc)(int );// Call-Back функция
	CFunc Func;	
};

class ClassB
{
public:
	static double BFunc(int t);	
	static void F2(int C1);
	int s;
};

void ClassB::F2(int C1)
{
	s=s+0;
}

double ClassB::BFunc(int t)
{
	F2(t);
	return t*3;
}

double MFunc(int t)
{
	return t*2;
}

int main(int argc, char* argv[])
{

	ClassA A;
	A.Func=MFunc;
	double t1=A.Func(10);// работает

	ClassB B;
	A.Func=B.BFunc;
	double t2=A.Func(10);

	return 0;
}
...
Рейтинг: 0 / 0
18.11.2013, 19:58
    #38469118
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class ClassB
{
public:
	static void F2(int C1);
	int s;
};

void ClassB::F2(int C1)
{
	s=s+0;
}



Статическая фукнция ClassB::F2 не может иметь доступ к нестатическим полям объекта класса.
Просто потому, что она не имеет неявной ссылки на объект класса.
...
Рейтинг: 0 / 0
18.11.2013, 20:00
    #38469120
Garfish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
MasterZiv,

а как сделать явную ссылку на объект этого класса?
...
Рейтинг: 0 / 0
18.11.2013, 20:09
    #38469131
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
Garfish,

Ещё одним явным параметром функции. Но если ты так сделаешь, то эта функция снова перестанет удовлетворять твоей нужной сигнатуре.
...
Рейтинг: 0 / 0
18.11.2013, 20:11
    #38469132
Garfish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
MasterZiv,

и как все это обойти?
...
Рейтинг: 0 / 0
18.11.2013, 20:12
    #38469134
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
Garfish,

Так зависит от того, куда ты хочешь прийти, наверное...
...
Рейтинг: 0 / 0
18.11.2013, 20:24
    #38469144
Garfish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
MasterZiv,

в классе ClassB, у меня выполняются расчеты, он содержит функции и массивы, для упрощения я написал код в несколько строк, функция BFunc(int t) вызывается через обратный вызов, она и вызывает другие функции, F2(int C1)в которых работа с массивами и переменными, по сути мне надо отладить последний листинг кода
...
Рейтинг: 0 / 0
18.11.2013, 20:27
    #38469148
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
Garfish,

Ну так может быть ты покажешь этот свой замечательный код в натуральном виде ?
В твоём последнем сообщении нет никакой новой информации -- во всех классах есть данные и код, и по названию топика уже можно предположить, что ты хочешь где-то вызывать callback.
...
Рейтинг: 0 / 0
18.11.2013, 20:33
    #38469151
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
Garfish ,

Предваряя всё остальное,
могу также предложить расширить определение типа твоей фукнции с

Код: plaintext
1.
typedef double (*CFunc)(int t1);



на

Код: plaintext
1.
typedef double (*CFunc)(ClassA *, int t1);



или
Код: plaintext
1.
typedef double (*CFunc)(ClassA&, int t1);
...
Рейтинг: 0 / 0
18.11.2013, 20:34
    #38469152
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
Garfishи как все это обойти?
Выкинуть к ЧМ все эти классы и вернуться к старому доброму процедурному программированию.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.11.2013, 20:42
    #38469155
Garfish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
MasterZiv,

код большой я его специально упростил что бы на пальцах была видна суть, делаю расчет распределения напряжений методом конечным элементов, несколько методов 3-5-...-n точечная задача. Создаются 2 класса, в ClassA задаются переменные, условия, диапазоны расчетов, конечные условия, в классе ClassВ методы расчетов и оперируемые данные

инициализируются 2 класса, задаются данные
Код: plaintext
1.
2.
3.
4.
5.
	
ClassA A;

	ClassB B;
	A.Func=B.BFunc;


и запускается рассчет
Код: plaintext
1.
A.Func(10);
...
Рейтинг: 0 / 0
18.11.2013, 20:51
    #38469161
Garfish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
MasterZiv,
расширим

Код: plaintext
1.
typedef double (*CFunc)(ClassA&, int t1);



а что делать с классом ClassA в F2, как его использовать?

Код: plaintext
1.
2.
3.
4.
void ClassB::F2(ClassA A, int C1)
{
	s=s+0;
}
...
Рейтинг: 0 / 0
18.11.2013, 20:59
    #38469165
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
Я слышал, что в С++ есть какая-то фигня по имени pointer-to-member, но так и не понял как
ими пользоваться. Может, тебе и подойдёт, раз уж ты так подсел на ООПу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.11.2013, 21:05
    #38469170
Garfish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
вот так последний вариант этого же кода
Код: plaintext
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.
class ClassA
{
public:
	typedef double (*CFunc)(int);// Call-Back функция
	CFunc Func;	
};
class ClassB
{
	
public:
	static double BFunc(int t);	
	static int F2(int C1);
	int s;
};
int ClassB::F2(int C1)
{
	return 	s+C1;
}
double ClassB::BFunc(int t)
{
	return F2(t)*3;
}
int main(int argc, char* argv[])
{
	ClassA A;
	ClassB B;
	A.Func=B.BFunc;
	double t2=A.Func(10);
	return 0;
}
...
Рейтинг: 0 / 0
18.11.2013, 21:50
    #38469201
Garfish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать указатель на функцию?
Garfish,

решено, всем спасибо за помощь

Код: plaintext
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.
class ClassA
{
public:
	typedef double (*CFunc)(int );// Call-Back функция
	CFunc Func;	
};
class ClassB
{
public:
	static double BFunc(int t);	
	static int F2(int C1);
	int s;
};
static ClassB B;
ClassA A;

int ClassB::F2(int C1)
{	
	return B.s+C1;
}
double ClassB::BFunc(int t)
{
	return F2(t)*3;
}
int main(int argc, char* argv[])
{	
	A.Func=B.BFunc;
	B.s=3;
	double t2=A.Func(10);
	return 0;
}
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / как передать указатель на функцию? / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]