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

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

Войти
Регистрация
Восстановить пароль
 
Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
#1

Есть ли альтернатива указателю на функцию - C++

13.06.2013, 13:04. Просмотров 339. Ответов 4
Метки нет (Все метки)

Добрый день!
Я решаю упражнение из книжки Страуструпа, в котором необходимо создать класс, который хранит параметры конcтруктора в своих данных членах, одним из параметров является функция.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef double Func(double);
 
struct Fct {
    Fct(Func& f, double r, int count)
        : function(f), rr(r), step(count) 
    {}
 
    void set_function(Func& ff) { function = ff; } // да это неправильно,
// но я надеюсь идея того что мне нужно понятна
 
private:
 
    Func& function; // изменения в коде класса, 
//который расположен ниже происходят только в этой строке
    double rr;
    int step;
 
};
Я не могу сохранить его как "значение", я могу только хранить ссылку на него.
Мне необходима возможно менять ссылку на этот объект, и тут я зашел в тупик, потому что единственный выход, который я вижу - использовать указатели.
Но по материалу книги - мы не проходили указатели. Я знаю о них из другой книги, поэтому меня гложат сомнения.

Пример с указателями:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Fct {
    Fct(Func& f, double r, int count)
        : function(f), rr(r), step(count) 
    {}
 
    void set_function(Func& ff) { function = ff; } // работает
 
private:
 
    Func* function; // указатель
    double rr;
    int step;
 
};

Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2013, 13:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Есть ли альтернатива указателю на функцию (C++):

GETS: есть ли альтернатива? - C++
Ходят слухи, что функция get опасна (кому интересно, эта тема есть на форуме, чуть раньше). Есть ли какая-то функция, которая так же...

Передача объекта по указателю в функцию - C++
Здравствуйте. При передаче объекта в метод другого объекта по указателю, метод получает непонятно что. class SomeObj { ...

Присвоение значения указателю на функцию - C++
Есть укзатель на функцию. Есть перегруженная функция. как присвоить указателю нужный нам вариант этой перегруженной функции?

Передача массива в функцию по указателю - C++
Помогите с заданием нужно передать массив в функцию по указателю

Передача вектора в функцию по указателю - C++
Есть функция с таким прототипом: void Split(const string& text, char delimeter, const vector<string>* pPars); как воспользоваться...

Передача в функцию по ссылке или указателю - C++
Гуру C++, как предпочтительнее делать?:) void f1(int &a) { a = 5; } void f2(int * a) {

4
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.06.2013, 13:41 #2
тайпдеф указателя на функцию
C++
1
typedef double (*Func)(double);
0
Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
13.06.2013, 14:20  [ТС] #3
Цитата Сообщение от Jupiter Посмотреть сообщение
тайпдеф указателя на функцию
C++
1
typedef double (*Func)(double);
мне бы совсем без указателей,

я хотел альтернативный вариант возможности хранения аргумента
C++
1
typedef double (Func)(double);
с возможностью его изменения

Добавлено через 7 минут
тоесть допустим я инициализирую объeкт
C++
1
Fct ff(sin,1.4,10);
а потом мне нужно изменить его таким образом

C++
1
ff.set_function(cos);
и всё это без указателей.
возможно ли это? или это трудности перевода, опечатка, или невнимательность Бьярне?
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.06.2013, 14:20 #4
Функция - это код, чтоб его вызвать, нужен его адрес, единственное низкоуровневое данное, которое умеет хранить адрес - это указатель, а все эти иттераторы, умные указатели, параметры-ссылки - это только надстройки над ним, а не альтернативы. Обычная переменная-ссылка - это вообще не отдельное данное, а синоним другого данного. Как говорится, слово, которое используют тогда, когда забыли произношение и написание основного слова, тебе она не подходит по причине необходимости передачи параметра.
0
Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
13.06.2013, 14:41  [ТС] #5
Цитата Сообщение от taras atavin Посмотреть сообщение
Функция - это код, чтоб его вызвать, нужен его адрес, единственное низкоуровневое данное, которое умеет хранить адрес - это указатель, а все эти иттераторы, умные указатели, параметры-ссылки - это только надстройки над ним, а не альтернативы. Обычная переменная-ссылка - это вообще не отдельное данное, а синоним другого данного. Как говорится, слово, которое используют тогда, когда забыли произношение и написание основного слова, тебе она не подходит по причине необходимости передачи параметра.
Спасибо.
Интересно, что подразумевал Страуструп? По-идее он предполагал что человек знакомый только со ссылками сможет решить эту задачу, иначе он бы намекнул хоть как-то (типа - ох прочитайте следующую главу сначала).
Как бы указатели только через две главы.
0
13.06.2013, 14:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2013, 14:41
Привет! Вот еще темы с ответами:

Передача аргументов в функцию по ссылке и указателю - C++
Чем отличается передача по ссылке от передачи по указателю аргументов в функцию?

Передачу аргументов в функцию по константному указателю - C++
Собственно, тривиальный пример с тривиальным вопросом, который вскрыл мое незнание. Почему выводит 5, а не 42? #include...

Передача параметра по указателю в виртуальную функцию - C++
Добрый вечер и с наступающим всех Новым Годом! условие задачи такое: Мышь (абстрактный) Вход: x,y – начальные s – чувствительность ...

Не получается присвоить значение указателю на функцию - C++
В строке 26 говорит, что не может конвертировать тип. Что неправильно? #include "stdafx.h" #include <iostream> #include <conio.h> ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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