Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.97
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
#1

Передача указателя на функцию - C++

25.08.2011, 11:17. Просмотров 3829. Ответов 21
Метки нет (Все метки)

Доброго дня Форумчане.
Хотелось бы узнать как вызывать функцию получив на нее указатель?
пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class C1 {
public:
     void f1() const { printf( "1" ); }
};
 
class C2 {
      C1 arr[10];
      int num;
      public:
      Storage() {num = 0;}
      void add(C1 c) ;
          void f2(void (C1::*y)()const)
      {
           for (int i=0;i<num;i++)   {        y;       }
      }
};
 
int main()
{
 C2 c;
 C2.add( C1() );
 C2.add( C1() );
 C2.f2( &C1::f1 );  
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2011, 11:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача указателя на функцию (C++):

Передача указателя на шаблонную функцию в другую функцию - C++
Пишу тест для нескольких улучшений квиксорта с измерением времени. Функция benchmark принимает итераторы для диапазона элементов, указатель...

передача указателя на функцию - C++
Помогите исправить ошибку уже незнаю как быть В бивает ту ошибку error C2664: Generate: невозможно преобразовать параметр 2 из &quot;void&quot;...

Передача в функцию указателя - C++
Почему плохо передавать в функцию указатель на строку или массив и возвращать указатель на строку или массив?

Передача указателя в функцию - C++
Здравствуйте. Прошу помощи, сижу уже пару часов читаю мануалы, но так и не смог до конца понять, что мне делать. Есть вот такой код: ...

Передача указателя в функцию - C++
Здраствуйте. Если не охота читать гору текста то этот абзац + последущий за ним код можете пропустить. Задали на лабе сделать некий...

Передача указателя на функцию - C++
Есть класс в котором: typedef void(*setChar)(int x, int y, wchar_t c); void Paint(setChar SetChar) В другом классе...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
25.08.2011, 14:18  [ТС] #16
Цитата Сообщение от Deviaphan Посмотреть сообщение
C++
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
struct Base
{
     virtual ~Base(){}
     void Func()=0;
};
 
class A : public Base
{
     void Func() {}
};
class B : public Base
{
    void Func() {}
};
 
class C
{
public:
   Base * arr[10];
 
    void Call( void (Base::*f)() )
    {
         for( int i = 0; i < 10; ++i )
              (arr[i]->*f)();
    }
};
 
int main()
{
    C c;
    c.Call( Base::Func );
}
Добавлено через 46 секунд
С другой стороны, скорее всего тебе и не нужно указатель на метод использовать.
А тут сложность что методы класса А и класса В не одинаковые и их все не описать в базе
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
25.08.2011, 14:22 #17
Цитата Сообщение от SatOleg Посмотреть сообщение
А тут сложность что методы класса А и класса В не одинаковые и их все не описать в базе
Тогда ты не сможешь обрабатывать единообразно.
Как вариант, хранить несколько массивов объектов и для каждого массива вызывать методы отдельные.
Т.е. ты не сможешь для С1 вызывать методы класса С2.
Если тебе нужна единообразная обработка, то это нужно делать либо через базовый класс, как в примере, либо через "умный" функтор, содержащий методы для всех типов объектов, хранящихся в нескольких массивах. Но это будет ужасный вариант.
Рекомендую задуматься о перепроектировании.
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
25.08.2011, 14:27  [ТС] #18
Цитата Сообщение от Deviaphan Посмотреть сообщение
Тогда ты не сможешь обрабатывать единообразно.
Как вариант, хранить несколько массивов объектов и для каждого массива вызывать методы отдельные.
Т.е. ты не сможешь для С1 вызывать методы класса С2.
Если тебе нужна единообразная обработка, то это нужно делать либо через базовый класс, как в примере, либо через "умный" функтор, содержащий методы для всех типов объектов, хранящихся в нескольких массивах. Но это будет ужасный вариант.
Рекомендую задуматься о перепроектировании.
надо загнать в класс элементы. потом получить указатель на метод и вызвать у всех хранимых элементов этот метод по указателю.

а через * void не получиться передавать независимо от типа. Ведь все что мне нужно это хранить в массиве элементы и вызывать для каждого элемента его метод.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
25.08.2011, 14:32 #19
Цитата Сообщение от SatOleg Посмотреть сообщение
а через * void не получиться передавать независимо от типа.
Во первых, за использование void* в типизированном языке нужно бить по попе, причём так, что бы это было не приятно.
Во вторых, если в методе не происходит обращение к полям объекта (как в твоём примере), то можешь использовать, никакой разницы не будет. Но не удивляйся, когда в методах появится обращение к полям объекта.
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
25.08.2011, 14:35  [ТС] #20
Цитата Сообщение от Deviaphan Посмотреть сообщение
Во первых, за использование void* в типизированном языке нужно бить по попе, причём так, что бы это было не приятно.
Во вторых, если в методе не происходит обращение к полям объекта (как в твоём примере), то можешь использовать, никакой разницы не будет. Но не удивляйся, когда в методах появится обращение к полям объекта.
Блин ( обращение к полям тоже надо.

а с макросами тоже не вариант? или введением безымянного типа
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
25.08.2011, 15:15 #21
Перестань путать шаблон и макрос! Они не помогут всё-равно.
Даже с безымянными типами ты не сможешь работать так хочешь. Ты вот сам подумай, то такое обращение к полю класса в методе? Это использование данных с известным смещением относительно начала объекта. Т.е. даже если названия полей совпадают, смещение у них всё равно может быть разным. Полагаться на то, что смещение одинаковое я категорически не советую.
У тебя явная ошибка проектирования (ну, я так думаю).
Не зная задачи больше ничем помочь тут низя.)
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
25.08.2011, 15:43 #22
озвучьте задачу , возможно вы двигаетесь в совсем неверном направлении
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2011, 15:43
Привет! Вот еще темы с ответами:

Передача указателя в функцию - C++
Поиском не пользовался, возможно данный вопрос уже проскакивал. Проблема том, что VS2010 на отрез отказывается передавать указатель на...

Передача указателя в функцию по ссылке - C++
Доброго времени суток. Может и в заголовке написан бред, но в общем нужно сделать так, чтобы указатель передавался в функцию, в функции...

Передача указателя на метод в функцию - C++
Подскажите плиз. Есть некий класс и в нём метод: ... DWORD WINAPI func(LPVOID lParam) { ... return 1; } ...

Передача в функцию указателя на указатель - C++
Добавление нового элемента в начало списка: void Add_Beg(List **u, Data &amp;x) // Почему в 1 аргументе функции указатель на указатель? { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.08.2011, 15:43
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru