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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2010, 12:26   #1
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию Указатель на функцию

Захотелось экстрима. Суть такова:
Есть функция void func1(int &i), которая выполняет действие i -= 15
Есть указатель на функцию void (*func2)(int &i).

f2 присваивается f1 и т.д. Работает.
Но я решил использовать эту фишку в конструкторе одного из классов.
То есть нужная функция должна передаваться конструктору в качестве параметра и там присваиваться указателю.
Вроде того (просто функция, не конструктор):

Код:
void func1(int &i){
 i -= 15;
}

void (*func2)(int &i);

void Attach(void (*f2)(int &i), void f1(int &i)){
 f2 = &f1;
}

int main(){
 int value = 30;
 Attach(func2, func1);
 
 (*func2)(value);

 return 0;
}
При компиляции не возникает никаких ошибок, но при вызове func2, которой уже присвоена func1 , происходит ошибка сегментирования.
Есть ли элегантные и надёжные способы решения моей проблемы?

Последний раз редактировалось Кипящий чайник; 10.10.2010 в 14:15.
Кипящий чайник вне форума Ответить с цитированием
Старый 10.10.2010, 12:34   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,085
По умолчанию

Вы в функцию передаёте f2 по значению, т.е. внутри функции новое значение присваивается, но func2 от этого не меняется. Смотрите как передавать указатель на функцию по ссылке/указателю.
pu4koff вне форума Ответить с цитированием
Старый 10.10.2010, 12:39   #3
ThisIzGame
Форумчанин
 
Регистрация: 31.08.2009
Сообщений: 161
По умолчанию

во-первых посмотрите как вы объявили указатель на функцию
Код:
void (*func2)(int i);
а теперь посмотрите параметры Attach
Код:
void (*f2)(int &i), void f1(int &i))
это раз.
два -
Код:
f2 = &f1;
наверно надо заменить на f2 = f1;
и еще насколько я понимаю, в функцию Attack вы передаетё копию func2, поэтому на строке (*func2)(value); ваша программа вылетает...
ThisIzGame вне форума Ответить с цитированием
Старый 10.10.2010, 13:39   #4
Chris D
Пользователь
 
Регистрация: 14.01.2010
Сообщений: 31
По умолчанию

Код:
#include "stdafx.h"
#include <iostream>

using namespace std;

class CAttach {
public:
	CAttach() {}
	CAttach(void (CAttach::*ptr) (int &), int &Value) {
		(this->*ptr)(Value);
	}
	void CFunc1(int &Value) {
		Value -= 15;
	}
};
int _tmain(int argc, _TCHAR* argv[])
{

	int Data = 30;
	CAttach cObj(&CAttach::CFunc1, Data);
	cout << Data << endl;

	system("PAUSE");
	return 0;
}
Если я правильно понимаю, ты нужно было это ?
Chris D вне форума Ответить с цитированием
Старый 10.10.2010, 14:33   #5
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Почти это, спасибо. Просто я хочу так, чтобы не пришлось каждый при вызове указывать, какую именно функцию я хочу использовать. Чтобы один-единственный раз указателю присвоить нужную функцию, и этот указатель вызывать.
Дело в том, что каждый объект может использовать свою функцию.
Может, подскажешь, как такое реализовать?
Кипящий чайник вне форума Ответить с цитированием
Старый 10.10.2010, 15:26   #6
Chris D
Пользователь
 
Регистрация: 14.01.2010
Сообщений: 31
По умолчанию

Код:
template <class __T> class CAttach {
public:
	CAttach(__T *Value) : ptr(&CAttach<__T>::CReverse) {
		(this->*ptr)(Value);
	}
           CAttach() {}
	void CReverse(__T *);
	void inline Decr(int &Value, const int Arg) {
		Value -= Arg;
	}
private:
	void (CAttach::*ptr)(__T *);
};
template <class __T>
void CAttach<__T>::CReverse(__T *Array) {
	int sLenght = strlen(Array) - 1;
	for(int index = 0; index < sLenght / 2; index++) {
		__T    TEMPO			=	*(Array + index);
		*(Array + index)			=	*(Array + sLenght - index);
		*(Array + sLenght - index)	=	TEMPO;
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	char sArray[] = "Hello Programmes Forum";
	
	for(int index = 0; index < sizeof(sArray); index++) {
		cout << sArray[index];
	}
	cout << endl;
	CAttach<char> cObj(sArray);
	for(int index = 0; index < sizeof(sArray); index++) {
		cout << sArray[index];
	}
	cout << endl;

	system("PAUSE");
	return 0;
}
Здесь мы явно присвоили указателю некое значение.
Chris D вне форума Ответить с цитированием
Старый 10.10.2010, 19:30   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,085
По умолчанию

Цитата:
Сообщение от Кипящий чайник Посмотреть сообщение
Почти это, спасибо. Просто я хочу так, чтобы не пришлось каждый при вызове указывать, какую именно функцию я хочу использовать. Чтобы один-единственный раз указателю присвоить нужную функцию, и этот указатель вызывать.
Дело в том, что каждый объект может использовать свою функцию.
Может, подскажешь, как такое реализовать?
Это называется делегированием. Так что гуглим "делегат на С++" и изучаем материал. Несколько готовых реализаций, пара статей на rsdn есть и, в целом, проблем с информацией по этой теме нет.
pu4koff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как объявить тип "указатель на функцию" coper Общие вопросы C/C++ 3 12.09.2010 23:20
Как передать в функцию указатель на String avd Общие вопросы C/C++ 6 06.06.2010 17:52
указатель на функцию. kotjara2 Общие вопросы C/C++ 9 11.02.2010 18:45
Указатель на функцию Роман Радер Общие вопросы C/C++ 2 09.11.2009 00:50
Как это сделать. Указатель на функцию. Levsha100 Свободное общение 15 25.09.2009 05:57