написать функцию, возвращающую указатель на саму себя
От: Олег Гашев
Дата: 12.10.04 16:59
Оценка:
В рецензии на книгу Саттера
Автор(ы): Герб Саттер

В данном издании объединены две широко известные профессионалам в области
программирования на C++ книги Герба Саттера Exceptional C++
и More Exceptional C++, входящие в серию книг C++ In-Depth,
редактором которой является Бьерн Страуструп, создатель языка C++.
Материал этой книги составляют переработанные задачи серии Guru of the Week,
рассчитанные на читателя с достаточно глубоким знанием C++.
Однако книга будет полезна каждому, кто хочет углубить свои знания в этой
области.
была приведена задача: "Можете ли Вы написать функцию, возвращающую указатель на саму себя? Если да, то для чего это может понадобиться?"

Что-то у меня очень просто получается:
#include <iostream>

using namespace std;

typedef void* (*FUN)();

void* mypointer()
{
    cout<<"mypointer"<<endl;
    return mypointer;
}

int main(void)
{
    FUN fun = (FUN)mypointer();
    fun();
    return 0;
}


Правильный ответ на вопрос пока не знаю... Подскажите.
Либо я найду путь, либо проложу его. © Свифт
Re: написать функцию, возвращающую указатель на саму себя
От: korzhik Россия  
Дата: 12.10.04 17:15
Оценка: 15 (1)
Здравствуйте, Олег Гашев, Вы писали:

ОГ>В рецензии на книгу Саттера
Автор(ы): Герб Саттер

В данном издании объединены две широко известные профессионалам в области
программирования на C++ книги Герба Саттера Exceptional C++
и More Exceptional C++, входящие в серию книг C++ In-Depth,
редактором которой является Бьерн Страуструп, создатель языка C++.
Материал этой книги составляют переработанные задачи серии Guru of the Week,
рассчитанные на читателя с достаточно глубоким знанием C++.
Однако книга будет полезна каждому, кто хочет углубить свои знания в этой
области.
была приведена задача: "Можете ли Вы написать функцию, возвращающую указатель на саму себя? Если да, то для чего это может понадобиться?"

ОГ>Правильный ответ на вопрос пока не знаю... Подскажите.

здесь
Re: написать функцию, возвращающую указатель на саму себя
От: Кодт Россия  
Дата: 12.10.04 17:53
Оценка: 15 (1)
Здравствуйте, Олег Гашев, Вы писали:

ОГ>В рецензии на книгу Саттера
Автор(ы): Герб Саттер

В данном издании объединены две широко известные профессионалам в области
программирования на C++ книги Герба Саттера Exceptional C++
и More Exceptional C++, входящие в серию книг C++ In-Depth,
редактором которой является Бьерн Страуструп, создатель языка C++.
Материал этой книги составляют переработанные задачи серии Guru of the Week,
рассчитанные на читателя с достаточно глубоким знанием C++.
Однако книга будет полезна каждому, кто хочет углубить свои знания в этой
области.
была приведена задача: "Можете ли Вы написать функцию, возвращающую указатель на саму себя? Если да, то для чего это может понадобиться?"


Кошка, которая гуляла сама по себе
Автор: Кодт
Дата: 03.10.03
...

ОГ>Что-то у меня очень просто получается:

У тебя хак, основанный на предположении, что можно сконвертировать указатель на данные — void* — в указатель на функцию — void*(*)().
Это — отступление от Стандарта, для платформ, на которых размер и структура указателей на данные и на функции совпадают.
Пример, где фокус не пройдёт: 8086, модель памяти compact (короткий указатель на данные, длинный на код).

На самом деле, можно возвращать void(*)(), поскольку все указатели на функции приводятся к нему и обратно.
Тем не менее, вызов такой функции будет обременён c-style-cast'ом
typedef void(*pfun)();
typedef pfun(*pmoebius)(int i);
pfun moebius() { print("run! %i\n", i); return moebius; }

main()
{
  pmoebius p = moebius;
  for(int i=0; i<10; ++i)
    p = (pmoebius)(p(i));
}
Перекуём баги на фичи!
Re: написать функцию, возвращающую указатель на саму себя
От: Aera Беларусь  
Дата: 12.10.04 20:04
Оценка: 21 (2)
Здравствуйте, Олег Гашев, Вы писали:

ОГ>Что-то у меня очень просто получается:

ОГ>
ОГ>typedef void* (*FUN)();
ОГ>


ОГ>Правильный ответ на вопрос пока не знаю... Подскажите.


Неправильно, поскольку тип указателя не совпадает с типом указатель на функцию. Правильный ответ заключается в том, что нужно возвратить объект, который содержит оператор приведения к типу фукнции:
struct Fun;
typedef Fun (FunPtr*)();

struct Fun
{
    Fun(FunPtr p) : ptr(p) {}
    operator FunPtr() const { return ptr; }
    FunPtr ptr;
};

Fun a()
{
    return &a;
}
// а можно использовать так
Fun b();
Fun c();

Fun f=&a;
while(не_надоест)
{
  f=f();
}


Но лучше всего прочитать книгу.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
--
RedApe
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.