Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279

Операторная ф-ция

06.12.2010, 00:08. Показов 831. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер,

вот есть код:

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
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>
 
using namespace std;
 
class generator
{
private: int& num;
 
public: explicit generator(int& n) : num(n)
    {
        cout << "In constructor fnc" << endl;
    }
 
    int operator ()()
    {
        cout << "In operator fnc" << endl;
        return num++;
    }
 
    ~generator()
    {
        cout << "Destroy object" << endl;
    }
};
 
int  main()
{
    int n = 0;
    vector<int> vect(20);
 
    generate(vect.begin(), vect.end(), generator(n));
 
    cout << "After" << endl;
    system("PAUSE");
    return 0;
}
главный вопрос по поводу строки
C++
1
generate(vect.begin(), vect.end(), generator(n));
я так понимаю запись
C++
1
generator(n)
создает временный объект который уничтожается после вызова ф-ции generate(), первый раз вызывается конструктор, а потом перегруженная ф-ция
C++
1
int operator ()()
1. Вопрос - почему по аналогию я не могу в программе создать тот же временный объект? например
C++
1
2
3
4
5
6
7
int  main()
{
    int n = 0;
    vector<int> vect(20);
    generator(n);
    .....
   ...
2. как компилятор различает после вызова контструктора
C++
1
generator(n)
что следующий вызов именно операторной ф-ции ведь она объявлена без параметров?

Спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.12.2010, 00:08
Ответы с готовыми решениями:

Операторная схема замещения
Доброго дня суток. Нужна помощь в решении этой задачи: Как должна выделить операторная схема замещения после коммутации? Останется...

Ошибка указывает на строку, в которой только операторная скобка
#include &lt;stdio.h&gt; #define N 100 #define M 100 void main() { FILE*f; int n, m; f = fopen(&quot;nyan.txt&quot;, &quot;r&quot;); fscanf(f,...

Ошибка указывает на строку, в которой только операторная скобка
#include &lt;stdio.h&gt; #include &lt;string.h&gt; char* DelSpace(char*, int); void main() { ...

3
 Аватар для Aye Aye
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
06.12.2010, 02:57
1. Так:
C++
1
generator(n)
ты объявляешь объект n класса generator.
C++
1
generator(x)(n); // что будет?
2. generate может быть определена следующим образом:
C++
1
2
3
4
5
6
template <typename Iter, typename GEN> void generate(const Iter& From, const Iter& To, GEN gen)
{
     for (Iter i = From; i != To; ++i) {
          *i = gen();
     }
}
как бы эта функция вызывает функцию или оператор operator() для каждого элемента коллекции.
generator(n) создает объект с оператором (), именно этот оператор и будет вызываться в функции generate, потому что GEN будет равно generator.
в этом примере шаблон инстанцируется в:

C++
1
2
3
4
5
6
void generate(const vector<int>::iterator& From, const vector<int>::iterator& To, generator gen)
{
     for (Iter i = From; i != To; ++i) {
          *i = gen(); // вот тут уже понятно, что gen это имя объекта, а не функции.
     }
}
примерно того же эффекта можно добиться определив функцию:
C++
1
2
3
4
5
6
int generator()
{
    static int x = 0;
    x++;
    return x;
}
тогда шаблон инстанцируется в:
C++
1
2
3
4
5
6
void generate(const vector<int>::iterator& From, const vector<int>::iterator& To, int (*gen)(void))
{
     for (Iter i = From; i != To; ++i) {
          *i = gen(); // очевидно вызов функции
     }
}
1
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
06.12.2010, 20:29  [ТС]
Цитата Сообщение от Aye Aye Посмотреть сообщение
ты объявляешь объект n класса generator.
кажется понимаю, то есть сначала создается объект, который передается в ф-цию, а в ф-ции уже
в строке
C++
1
*i = gen();
вызывается операторная ф-ция

одно только не понял, почему с вашего поста создается именно объект n, ведь n - это всего лишь переменная
C++
1
2
3
4
int n = 0;
vector<int> vect(20);
 
generate(vect.begin(), vect.end(), generator(n));
которая используется при конструировании объекта как параметр?
0
 Аватар для Aye Aye
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
06.12.2010, 22:12
чет не понял, про это вопрос:
Цитата Сообщение от Aye Aye Посмотреть сообщение
1. Так:
C++
1
generator(n)
ты объявляешь объект n класса generator.
я имел ввиду, что компилятор встерив "generator(n)" попробует создать объект с именем n типа generator, а так как имя n уже зянято , то это приведет к ошибке.
компилятор руководствуется правилом: Все что выглядит как обьявление - это обьявление.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.12.2010, 22:12
Помогаю со студенческими работами здесь

Ошибка указывает на строку, в которой только операторная скобка
#include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;string.h&gt; int nod(int, int); int nok(int, int); char* DelSpace(char*, int); ...

ф-ция
Написать программу, проверяющую делимость целого числа на числа от 2 до 10. Проверка делимости на конкретное число должна быть реализована...

ф-ция с throw
Встретил такую мне незнакомую запись: тип имя_функции( параметры ) throw(что-то) { тело_ф-ции } Что дает такая запись с...

Рандомная ф-ция rand()
Всем привет,объясните пожалуйста как работает рандомная ф-ция,например: rand()%10 == 5 rand()%15+2 rand()%5 == 1 rand()%5 ...

ф-ция реверса строки
был вчера на собеседовании, попросили написать ф-цию реверса строки (поменять местами 1й и последний символы, 2й и предпоследний и т.д.),...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru