Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
1

Функция должна принять указатель на саму себя

07.01.2014, 22:48. Показов 3916. Ответов 46
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
не рекурсия. (ошибка в названии)
Функция должна принять указатель на саму себя.
моя неверная попытка имеет вид
C++
1
2
3
4
5
6
7
8
9
10
11
int myfunc(int (*P)(int))  принимаю указатель на функцию
{
   return 0;
}
 
int main()
{
  int (*P)( int (*)(int) ); //создаю указатель на функцию
  P=myfunc; //присваиваю в указатель адрес функции
  myfunc(P); //попытка передарь функции указатель на саму себя. неверная.
}
Это как делается?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.01.2014, 22:48
Ответы с готовыми решениями:

Зачем функция вызывает саму себя?
#include <stdio.h> #include <vector> int g; bool used; int n, m; //поясните мне эту...

Функция должна возвращать указатель на первый элемент массива,удовлетворяющий условию
Функция должна возвращать указатель на первый элемент массива,удовлетворяющий условию(в данном...

Подскажите немножко с рекурсией ( Функция должна вызывать сама себя до тех пор пока sum не станет больше х)
Вводим число х. Функция должна вызывать сама себя до тех пор пока sum не станет больше х. Но...

Перемножить матрицу на саму себя
Подскажите пожалуйста, как можно реализовать эту задачу: Нужно будет перемножить матрицу на саму...

46
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.09.2015, 21:28 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от daslex Посмотреть сообщение
Всё, что в class мне неизвестно, следовательно непонятно в принципе.
на самом деле там ничего сложного и сверъестественного нет.

я мог бы вам объяснить, как работает такая магия.
но только если вы понимаете шаблоны хотя бы на базовом уровне.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
21.09.2015, 21:37  [ТС] 42
На базовом понимаю. Зачем они нужны тоже понимаю. Однозначно знаю не всю подноготную, но малая, вводная часть о шаблонах мне известна. Что Вы понимаете под базовым уровнем не очень понимаю. Понятие базовых знаний у людей обычно отличается. Как они там делают "большое пузо" небольшим с виду кодам, например, плохо понимаю, только в общих чертах.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.09.2015, 22:11 43
Цитата Сообщение от daslex Посмотреть сообщение
На базовом понимаю. Зачем они нужны тоже понимаю. Однозначно знаю не всю подноготную, но малая, вводная часть о шаблонах мне известна. Что Вы понимаете под базовым уровнем не очень понимаю. Понятие базовых знаний у людей обычно отличается. Как они там делают "большое пузо" небольшим с виду кодам, например, плохо понимаю, только в общих чертах.
тогда поехали:

для начала отвлечемся от вашей задачи.
забудье на время обо всем, о чем мы с вами говорили прежде.
начнем с чистого листа.

предположим, есть неккий класс "кнопка".
и если на кнопку нажали - пусть она предупредит наш клиентский код об этом событии.

но проблема в том, что "кнопка" - это библиотечный класс, который ничего о нас не знает
как же она сможет прудепредить нас о нажатии, если она ничего о нас не знает?

и вот здесь на помощь приходят "делегаты" - механизмы,
которые позволяют выполнить опосредованный вызов произвольной функции,
или функции-члена,
без необходимости знать, что именно будет вызванно.


вот так это может выглядеть в коде:

http://rextester.com/TSIWEX43141

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
33
34
35
36
#include <iostream>
#include <functional>
 
struct button
{
 
    typedef std::function<void()>
        callback;
    
    
    callback onPressed;
    
    
    void simulatePressed()
    {
        if(onPressed)
            onPressed();
    }
};
 
 
void if_pressed()
{
    std::cout<<"на кнопку нажали\n"; 
}
 
int main()
{
    std::cout << "Hello, world!\n";
    
    button b;
    b.onPressed = if_pressed;
    
    
    b.simulatePressed();
}
кнопка ничего о нас не знает.
но мы указали ей, что нужно дернуть,
что бы нас предупредить.


теперь следущий шаг:
вы наверное уже заметили,
что всю грязную работу на себя берет чудесный механизм std::function.

как он это делает?

концептуальная схема:
http://rextester.com/QXLF72730


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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
 
 
// --- будем запускать её
int foo() { std::cout<< __PRETTY_FUNCTION__ << std::endl; return 0; }
 
 
// --- общий шаблон - не функционирует
// попытка вызвать его для абы какого T будет приводить
// к ошибкам компиляции
template<class T>struct delegate;
 
    
// --- специализация для случая, когда делегат
// это функция    
template<class R, class... Args>
struct delegate<R(Args...)>
{
    // из шаблона выводится тип функции
    // которую нужно запустить.
    typedef R(*pFunc)(Args...);
    
    
    // --- нацеливание делегата в конструкторе
    delegate( R foo(Args...)  )
        :mFunc(foo) 
    {} 
    
    R operator ()(Args&&... args)
    {
        // -- запуск функции
        return  mFunc( std::forward<Args>(args)...  );
    }
    
    pFunc mFunc;
};
 
 
int main()
{
    std::cout << "Hello, world!\n";
 
    
    // --- создаем делегат,
    // который нацелен на запуск функции foo
    delegate<int()> d = foo;
    
    // запускаем функцию foo опосредованно,
    // через делегат
    d();
}
в реальности делегаты учитывают множество самых различных нюансов,
что позволяет нацелить их куда угодно.
1
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
21.09.2015, 23:41 44
Цитата Сообщение от daslex Посмотреть сообщение
только как если бы без typedef было не понимаю.
Не в тайпдефе дело. Если подпереться самым мощным костылем С++, коим является наследованная от Си низкоуровневость, можно и без него.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
void f (void (*_f)(void*)) {
  static int n= 2;
  std::cout << n << std::endl;
  if (--n) _f ((void*)f);
}
 
int main() {
  void (*pf)(void(*)(void*))= f;
  pf ((void(*)(void*))f);
}
В самой сишке с типизацией еще проще. Как сказали бы педанты, ещё большее раздолбайство, так что и без явного приведения обошлось. (во всяком случае, gcc и clang предупреждений не пишут).
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
void f (void (*_f)()) {
  static int n= 2;
  printf ("%d\n", n);
  if (--n) _f (f);
}
 
int main() {
  void (*pf)(void(*)())= f;
  pf (f);
}
Без приведения типов в рамках указателей на функцию, как вам уже пояснили, задачу решить невозможно. Но ИМХО, Си++ со строгой типизацией - это уже не Плюсы.
1
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.09.2015, 23:50 45
Цитата Сообщение от gng Посмотреть сообщение
void (*pf)(void(*)(void*))= f;
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
22.09.2015, 00:11  [ТС] 46
gng, тому сообщению откуда выдрана цитата почти год уже)

Добавлено через 10 минут

Не по теме:

Я как бы сторонник версии, что у C/C++ возможности воистину безграничны, а непосредственно С++ - язык, который не способен пока что быть независимым, ибо ему периодически нужно костыли. Отсюда мое "С++ всего не может".

0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
22.09.2015, 00:21 47

Не по теме:

Цитата Сообщение от daslex Посмотреть сообщение
gng, тому сообщению откуда выдрана цитата почти год уже)
Извиняюсь, просмотрел.



Добавлено через 3 минуты

Не по теме:

hoggy, В плюсах можно заменить

C++
1
auto pf= f;
В сишке такого пока нету :-((

0
22.09.2015, 00:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.09.2015, 00:21
Помогаю со студенческими работами здесь

Почему C++ программа не удаляет саму себя?
Имеется следующий код (файл 01del.cpp): #include &lt;windows.h&gt; using namespace std; int main()...

Форма HTML по методу GET должна открывать саму себя, но не может
создаю форму, которая должна вызывать саму себя, но никак не работает, замучилась совсем, люди...

Функция должна принимать указатель на неизвестный класс?
Ситуация: 1.срр 2.срр 1.h 2.h В 1.h создан класс myClass, в 2.h описание функции, которая...

Ссылка с ключами на саму себя
Добрый день! Часто замечаю на сайтах (например главная страница) есть ссылка на эту же страницу с...


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

Или воспользуйтесь поиском по форуму:
47
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru