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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Хранение экземпляров классов-наследников, и вызов их методов http://www.cyberforum.ru/cpp-beginners/thread1065275.html
Столкнулся с проблемой. Есть класс-родитель и 2 класса-наследника. class Base { public: void baseFunc(); }; class Derived1 : public Base
C++ Получить все возможные варианты комплектов книг. Исправить код #include<iostream.h> using namespace std; int main() { int i=0, j=0, k=0, m=0; while(i<7) { http://www.cyberforum.ru/cpp-beginners/thread1065260.html
Определить структуру Модель Виндовс для работы с моделями экранных окон.В качестве полей задаются C++
Определить структуру Model Window для работы с моделями экранных окон.В качестве полей задаются:заголовок окна,координаты левого верхнего угла,размер по горизонтали,размер по вертикали,состояние "видимое/невидимое",состояние"с рамкой/без рамки".Координаты и размеры указываются в целых числах.Кроме функций read и print реализовать следующие функции:передвижение окна по горизонтали,по...
C++ Найти уравнение прямой, проходящей через точку А
Найти уравнеие прямой (в форме альфа*x+бета*y+гамма=0),проходящей через точку А(X1,Y1) перпендикулярно к прямой ax+by+c=0. Пожалуйста помогите написать программу.
C++ Узнать какая кнопка была нажата SDL2.0 http://www.cyberforum.ru/cpp-beginners/thread1065234.html
Привет, как в этом примере узнать какая кнопка была нажата, я хочу сделать для каждой кнопки отдельное действия, но не могу понять, как узнать какая кнопка была нажата Код: /*This source code copyrighted by Lazy Foo' Productions (2004-2013) and may not be redistributed without written permission.*/ //Using SDL, SDL_image, standard IO, and strings #include <SDL.h> #include <SDL_image.h>
C++ Определить, можно ли представить число в виде суммы двух квадратов натуральных чисел Дано натуральное число n.Определить,можно ли представить его в виде суммы двух квадратов натуральных чисел.Если да,то найти все пары x,y такие,что n=x^2+y^2 (x<=y). Очень нужна ваша помощь,помогите пожалуйста. подробнее

Показать сообщение отдельно
hoggy
5600 / 2230 / 411
Регистрация: 15.11.2014
Сообщений: 5,025
Завершенные тесты: 1
21.09.2015, 20:02     Функция должна принять указатель на саму себя
Цитата Сообщение от daslex Посмотреть сообщение
А в функции, вовнутрь которой приходит указатель, который уже показывает на адрес функции, в которую он пришел.
так и есть.

вы ж понимаете, что делает операция взятия адреса?
результатом такой операции является указатель,
который хранит адрес объекта.

смотрите:
C++
1
2
3
// во внутрь foo попадает объект, 
// который является указателем на функцию foo
foo(&foo, 10);
если нужно придержать снаружи,
тогда вот, пожалуйста:

C++
1
2
3
4
5
// --- срисовали
const auto pFunc = recursivePointer(&foo);
 
// чуть позде можно будет запускать:
foo(pFunc, 10);



Цитата Сообщение от daslex Посмотреть сообщение
Вовнутрь функции должен передаваться указатель. При этом в разные моменты времени, в зависимости от того, на какую функцию указывает указатель, разыменование указателя приводит к вызову функции, в которую как параметр приходит адрес на начало самой себя. Т.е. если внутри функции просто разыменовывать пришедший в нее указатель, то должна происходить рекурсия.
так и есть, за исключением того, что разыменовывать не нужно:

C++
1
2
3
4
5
6
7
8
9
10
11
// --- принимает рекурсивный указатель на саму себя
void foo(const recursivePointer& f, const size_t depth)
{
    if(depth == 0)
        return;
    
    std::cout<<"depth recursieve: "<< depth << '\n';
 
    // --- дергает саму себя по указателю
    f(depth - 1);
}
строго говоря,
даже самый обычный указатель на функцию не нужно разыменовывать,
что выполнить запуск функции по указателю.

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

Цитата Сообщение от daslex Посмотреть сообщение
Я правда не вижу этого у Вас в коде.
ну даже если вы не владеете магией шаблонов,
тем менее вы не можете не увидеть,
что в функцию foo передается адрес функции foo.
и что сама функция foo запускает сама себя дергая себя через рекурсивный указатель.

кроме того, просто рассуждайте логически:
как компилятор мог догадаться, что нужно вызывать именно foo?
он же не с потолка это взял.

он знает, что нужно рекурсивно запускать функцию foo,
потому что я скормил ей указатель на саму себя.

можно было бы скормить что нибудь другое.
но тогда и вызвалось бы тоже что-то другое.
и не было бы рекурсии.

Добавлено через 3 минуты
Цитата Сообщение от daslex Посмотреть сообщение
**ptr; //Обычным разыменованием указателя Вызвал функцию.
нет, так не годится.

технически это конечно можно.
но так не делают.

вот вам простейший встречный вопрос: предположим, нужно вызвать функцию с параметрами.
пускай там будет два инта.
и как вы эти параметры передадите?

результат операции разыменовывания должен дать ссылку на объект,
а не выполнять запуски функций.

что бы выполнить запуск функций,
должна быть возможность указать аргументы,
с которыми нужно позвать функцию:

C++
1
2
3
4
5
6
7
8
9
10
void foo(const recursivePointer& f, const size_t depth)
{
    if(depth == 0)
        return;
    
    std::cout<<"depth recursieve: "<< depth << '\n';
 
    // --- вызвать саму себя, передав явный дополнительный аргумент
    f(depth - 1);
}
но ещё повторюсь:
это уже вопросы дизайна.
этакая косметика.
сделать то можно по всякому.
 
Текущее время: 07:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru