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

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

Восстановить пароль Регистрация
 
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
06.12.2010, 00:08     Операторная ф-ция #1
Добрый вечер,

вот есть код:

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)
что следующий вызов именно операторной ф-ции ведь она объявлена без параметров?

Спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2010, 00:08     Операторная ф-ция
Посмотрите здесь:

C++ Глобальная ф-ция getline
C++ Морской бой. Ф-ция автоматической рассатновки кораблей.
C++ STL библиотека. Ф-ция for_each
C++ Общая ф-ция для классов
C++ Какая ф-ция в VC++ определяет длину строки???
C++ ф-ция с throw
C++ ф-ция
C++ ф-ция реверса строки
C++ Рандомная ф-ция rand()
Магическое число и ф-ция goto C++
C++ Параметризованная ф-ция класса
ф-ция getche() не выполняется C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
06.12.2010, 02:57     Операторная ф-ция #2
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(); // очевидно вызов функции
     }
}
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
06.12.2010, 20:29  [ТС]     Операторная ф-ция #3
Цитата Сообщение от 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));
которая используется при конструировании объекта как параметр?
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
06.12.2010, 22:12     Операторная ф-ция #4
чет не понял, про это вопрос:
Цитата Сообщение от Aye Aye Посмотреть сообщение
1. Так:
C++
1
generator(n)
ты объявляешь объект n класса generator.
я имел ввиду, что компилятор встерив "generator(n)" попробует создать объект с именем n типа generator, а так как имя n уже зянято , то это приведет к ошибке.
компилятор руководствуется правилом: Все что выглядит как обьявление - это обьявление.
Yandex
Объявления
06.12.2010, 22:12     Операторная ф-ция
Ответ Создать тему
Опции темы

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