Форум программистов, компьютерный форум, киберфорум
Наши страницы

Функция должна принять указатель на саму себя - 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 для работы с моделями экранных окон.В качестве полей задаются:заголовок окна,координаты левого верхнего угла,размер по горизонтали,размер по вертикали,состояние...
C++ Найти уравнение прямой, проходящей через точку А
Найти уравнеие прямой (в форме альфа*x+бета*y+гамма=0),проходящей через точку А(X1,Y1) перпендикулярно к прямой ax+by+c=0. Пожалуйста помогите написать программу.
C++ Узнать какая кнопка была нажата SDL2.0 http://www.cyberforum.ru/cpp-beginners/thread1065234.html
Привет, как в этом примере узнать какая кнопка была нажата, я хочу сделать для каждой кнопки отдельное действия, но не могу понять, как узнать какая кнопка была нажата Код: /*This source code...
C++ Определить, можно ли представить число в виде суммы двух квадратов натуральных чисел Дано натуральное число n.Определить,можно ли представить его в виде суммы двух квадратов натуральных чисел.Если да,то найти все пары x,y такие,что n=x^2+y^2 (x<=y). Очень нужна ваша помощь,помогите... подробнее

Показать сообщение отдельно
hoggy
6718 / 2903 / 497
Регистрация: 15.11.2014
Сообщений: 6,533
Завершенные тесты: 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);
}
но ещё повторюсь:
это уже вопросы дизайна.
этакая косметика.
сделать то можно по всякому.
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.