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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2009, 13:21   #1
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию pointeur на функцию в классе

есть класс ньютона рафсона:
Код:
class newt
{
public:
void (*nrfuncv)(int nn, std::vector <double> &v, std::vector <double> &f);                   //

void (*jacobfunc)(std::vector <double> &, std::vector <double> &, std::vector < std::vector<double> > &);                           //

  //Funkciya vivoda promejutochnih rezul'tatov                             //
  void (*on_subproduct)();//}
и есть класс:
Код:
class interface
{
public:
  interface();
  interface(phase *,phase *); //Constructeur
  void equilibre_Fe_Cr_C(int, std::vector <double> &Y, std::vector <double> &F);
  void Jacobian(std::vector <double> &Y, std::vector <double> &F, std::vector < std::vector<double> > &Jacobian2D);
};
Я не знаю как в функции майн присвоить функции void (*nrfuncv) функцию void equilibre_Fe_Cr_C(...):
Код:
int main()
{
newt nt;
interface mv;
nt.nrfuncv = mv.interface; //это не работает
}

как быть. подскажите пожалуйста

Последний раз редактировалось ciaonataha; 21.04.2009 в 13:51.
ciaonataha вне форума Ответить с цитированием
Старый 21.04.2009, 14:41   #2
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Что значит "присвоить функции функцию"?
Что вы конкретно хотите сделать?
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 21.04.2009, 14:46   #3
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Цитата:
nt.nrfuncv = mv.interface; //это не работает
Я так понимаю, тут имелось в виду
Код:
nt.nrfuncv = mv.equilibre_Fe_Cr_C;
Это не работает, потому что в классе newt указатель описан как указатель на простую функцию. А ему пытаются присвоить указатель на метод класса. Почувствуйте разницу.
Вот если в кассе interface метод equilibre_Fe_Cr_C объявить как статический, то это прокатит.
Либо в newt надо описывать указатель по-другому.
Pashan вне форума Ответить с цитированием
Старый 21.04.2009, 14:52   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,091
По умолчанию

Так просто получится только если объявить метод как static. Иначе нужно хранить указатель на объект и указатель на его метод.
Код:
class newt
{
public:
  interface *m_interface;
public:
void (interface::*nrfuncv)(int nn, std::vector <double> &v, std::vector <double> &f);
...
}
Код:
int main()
{
newt nt;
interface mv;
nt.m_interface = &mv; // Передаём указатель на объект interface
nt.nrfuncv = &(interface::equilibre_Fe_Cr_C); // Передаём ссылку на метод класса interface
// Вызов метода через указатель
(nt.m_interface->*nt.nrfuncv)(/*параметры*/);
}
pu4koff вне форума Ответить с цитированием
Старый 21.04.2009, 15:02   #5
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

как же мне тогда
Код:
void (interface::*nrfuncv)(int nn, std::vector <double> &v, std::vector <double> &f);
описивать в функции
Код:
void newt::calc(std::vector <double> &x, int *check)

{(*nrfuncv)(nn, x, f);}
ciaonataha вне форума Ответить с цитированием
Старый 21.04.2009, 15:05   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,091
По умолчанию

Я же Вам написал в посте выше в последней строчке функции main как по указателю метод вызывать. "nt." только уберите оттуда и параметры напишите
pu4koff вне форума Ответить с цитированием
Старый 21.04.2009, 15:06   #7
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

выдает следущую ошибку:

Код:
newt.cpp: In member function 'double newt::fmin(std::vector<double, std::allocator<double> >&)':
newt.cpp:119: error: invalid use of 'unary *' on pointer to member
newt.cpp: In member function 'void newt::calc(std::vector<double, std::allocator<double> >&, int*)':
newt.cpp:140: error: invalid use of 'unary *' on pointer to member
preci.cpp: In function 'int main()':
preci.cpp:36: error: invalid use of non-static member function 'void interface::equilibre_Fe_Cr_C(int, std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&)'
ciaonataha вне форума Ответить с цитированием
Старый 21.04.2009, 15:09   #8
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

newt.cpp:119:
Код:
double newt::fmin(std::vector <double> &x)
{

  int i;

  double sum;

  (*nrfuncv)(GetN(), x, fvec);
}
newt.cpp:140:
Код:
void newt::calc(std::vector <double> &x, int *check)

{   (*nrfuncv)(nn, x, f);}

preci.cpp:36:
Код:
int main(){
nt.nrfuncv = &(interface::equilibre_Fe_Cr_C);}
ciaonataha вне форума Ответить с цитированием
Старый 21.04.2009, 15:18   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,091
По умолчанию

Вот 100% рабочий код ( по крайней мере в VC++ 2005 ):
Код:
// newt.h
#include <vector>

class interface
{
public:
	void equilibre_Fe_Cr_C(int n, std::vector <double> &Y, std::vector <double> &F)
	{ // Тут для примера заполняем вектора числами
		for (int i = 0; i < n; ++i)
		{
			Y.push_back(i);
			F.push_back(i);
		}
	}
};

class newt
{
public:
	interface *m_interface;
	void (interface::*nrfuncv)(int nn, std::vector <double> &v, std::vector <double> &f);                   //
public:
	void calc()
	{
		std::vector <double> loc_v;
		std::vector <double> loc_f;
		(m_interface->*nrfuncv)(10, loc_v, loc_f);
	}
};

//main.cpp
#include "newt.h"

int main()
{
	newt nt;
	interface mv;
	nt.m_interface = &mv;
	nt.nrfuncv = &interface::equilibre_Fe_Cr_C;
	nt.calc();
	getchar();
	return 0;
}
pu4koff вне форума Ответить с цитированием
Старый 21.04.2009, 15:22   #10
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

есть пример:
Код:
class Point{
public:: 
Point *pfm;
public::
void movex(int);
void (Point::*pfm)(int) = Point::movex;
}

int main()
{
Point p;
(p.*pfm)(10);
ciaonataha вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование String^ в классе Selebro Общие вопросы C/C++ 2 01.12.2008 11:13
Интернет в компьютерном классе. soktahan Свободное общение 8 10.11.2008 06:05
константность в классе softrix Общие вопросы C/C++ 1 17.06.2008 00:21
Получение информации о классе Sibedir Общие вопросы Delphi 7 07.12.2007 14:37