powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / как передать указатель на функцию?
25 сообщений из 27, страница 1 из 2
как передать указатель на функцию?
    #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
как передать указатель на функцию?
    #38469022
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfish,

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

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

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



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

это для меня новое можешь показать как должена выглядеть статическая функцией класса (методом) без this
...
Рейтинг: 0 / 0
как передать указатель на функцию?
    #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
как передать указатель на функцию?
    #38469044
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

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

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

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

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

Код полностью и тексты ошибок.
...
Рейтинг: 0 / 0
как передать указатель на функцию?
    #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
как передать указатель на функцию?
    #38469112
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ругается на s
error C2597: illegal reference to data member 'ClassB::s' in a static member function
...
Рейтинг: 0 / 0
как передать указатель на функцию?
    #38469116
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfish,

это невалидный код. с 1-ой строчки.
...
Рейтинг: 0 / 0
как передать указатель на функцию?
    #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
как передать указатель на функцию?
    #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
как передать указатель на функцию?
    #38469120
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

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

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

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

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

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

Ну так может быть ты покажешь этот свой замечательный код в натуральном виде ?
В твоём последнем сообщении нет никакой новой информации -- во всех классах есть данные и код, и по названию топика уже можно предположить, что ты хочешь где-то вызывать callback.
...
Рейтинг: 0 / 0
как передать указатель на функцию?
    #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
как передать указатель на функцию?
    #38469152
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfishи как все это обойти?
Выкинуть к ЧМ все эти классы и вернуться к старому доброму процедурному программированию.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как передать указатель на функцию?
    #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
как передать указатель на функцию?
    #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
как передать указатель на функцию?
    #38469165
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я слышал, что в С++ есть какая-то фигня по имени pointer-to-member, но так и не понял как
ими пользоваться. Может, тебе и подойдёт, раз уж ты так подсел на ООПу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как передать указатель на функцию?
    #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
как передать указатель на функцию?
    #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
25 сообщений из 27, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / как передать указатель на функцию?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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