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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,665
#1

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

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

не рекурсия. (ошибка в названии)
Функция должна принять указатель на саму себя.
моя неверная попытка имеет вид
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); //попытка передарь функции указатель на саму себя. неверная.
}
Это как делается?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2014, 22:48     Функция должна принять указатель на саму себя
Посмотрите здесь:

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

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

Перемножить матрицу на саму себя - C++
Подскажите пожалуйста, как можно реализовать эту задачу: Нужно будет перемножить матрицу на саму себя. Вот пример: Матрица 1: 0 A B ...

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

Указатель в списке ссылается на себя, а не на следующий элемент - C++
Уважаемые, форумчане! Помогите разобраться в вопросе. Я хочу реализовать стек(добавление элемента) на основе односвязного списка. ...

Деструктор для класс, имеющий указатель на самого себя - C++
Здравствуйте. Дан класс, для него нужно написать деструктор. using namespace std; class List{ private: int myValue; List...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
6410 / 2628 / 457
Регистрация: 15.11.2014
Сообщений: 5,802
Завершенные тесты: 1
21.09.2015, 21:28     Функция должна принять указатель на саму себя #41
Цитата Сообщение от daslex Посмотреть сообщение
Всё, что в class мне неизвестно, следовательно непонятно в принципе.
на самом деле там ничего сложного и сверъестественного нет.

я мог бы вам объяснить, как работает такая магия.
но только если вы понимаете шаблоны хотя бы на базовом уровне.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,665
21.09.2015, 21:37  [ТС]     Функция должна принять указатель на саму себя #42
На базовом понимаю. Зачем они нужны тоже понимаю. Однозначно знаю не всю подноготную, но малая, вводная часть о шаблонах мне известна. Что Вы понимаете под базовым уровнем не очень понимаю. Понятие базовых знаний у людей обычно отличается. Как они там делают "большое пузо" небольшим с виду кодам, например, плохо понимаю, только в общих чертах.
hoggy
6410 / 2628 / 457
Регистрация: 15.11.2014
Сообщений: 5,802
Завершенные тесты: 1
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();
}
в реальности делегаты учитывают множество самых различных нюансов,
что позволяет нацелить их куда угодно.
gng
634 / 480 / 131
Регистрация: 08.09.2013
Сообщений: 1,280
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);
}
Без приведения типов в рамках указателей на функцию, как вам уже пояснили, задачу решить невозможно. Но ИМХО, Си++ со строгой типизацией - это уже не Плюсы.
hoggy
6410 / 2628 / 457
Регистрация: 15.11.2014
Сообщений: 5,802
Завершенные тесты: 1
21.09.2015, 23:50     Функция должна принять указатель на саму себя #45
Цитата Сообщение от gng Посмотреть сообщение
void (*pf)(void(*)(void*))= f;
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,665
22.09.2015, 00:11  [ТС]     Функция должна принять указатель на саму себя #46
gng, тому сообщению откуда выдрана цитата почти год уже)

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

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2015, 00:21     Функция должна принять указатель на саму себя
Еще ссылки по теме:

Странно ведёт себя функция fgets - C++
(в файле лежит предложение на английском) int main() { FILE *f; char str; if ((f=fopen(&quot;Е:\\...имя файла&quot;,&quot;r&quot;))=NULL){printf...

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

Функция которая принимает в себя 3 числа - C++
Доброе время суток, подскажите как сделать такой пример Описать функцию, которая принимает в себя 3 числа и выводит на экран большее...

Функция должна вернуть 4 параметра - C++
Здравствуйте. Что то я совсем подзабыл основы. Есть функция в которую я передаю 4 параметра в виде одного масива int a, а возвращает одно...

Функция должна вычислять рандомное значение от a до b - C++
Создать 2 функции, первая должна вычислять рандомное значение от a до b( a и b мы должны ввести сами),это значение должно выводится в...


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

Или воспользуйтесь поиском по форуму:
gng
634 / 480 / 131
Регистрация: 08.09.2013
Сообщений: 1,280
22.09.2015, 00:21     Функция должна принять указатель на саму себя #47

Не по теме:

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



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

Не по теме:

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

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

Yandex
Объявления
22.09.2015, 00:21     Функция должна принять указатель на саму себя
Ответ Создать тему
Опции темы

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