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

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

Войти
Регистрация
Восстановить пароль
 
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
#1

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

06.12.2010, 00:08. Просмотров 434. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2010, 00:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Операторная ф-ция (C++):

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

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

Глобальная ф-ция getline - C++
Всем добрый вечер :) Вообщем есть кусок кода: // read for name vector while (std::getline(std::cin, name)) { ...

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

Параметризованная ф-ция класса - C++
Пытаюсь заменить списки (используя структуры) на списки используя параметризованную функцию класса Компилятор ругается на строчку где я...

ф-ция getche() не выполняется - C++
В MVS 2015 не выполняется ф-ция getche() (в коде строка 52) по этому цикл выполняется всего один раз. Как это исправить? Проверял код в...

3
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(); // очевидно вызов функции
     }
}
1
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));
которая используется при конструировании объекта как параметр?
0
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 уже зянято , то это приведет к ошибке.
компилятор руководствуется правилом: Все что выглядит как обьявление - это обьявление.
0
06.12.2010, 22:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2010, 22:12
Привет! Вот еще темы с ответами:

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

Магическое число и ф-ция goto - C++
Помогите усовершенствовать программку ,пожалуйста) После того как угадал число --- Возвращать в начало к выбору 3-х вариантов.Думал...

STL библиотека. Ф-ция for_each - C++
При изучении STL, столкнулся со странным поведением ф-ции for_each библиотеки algorithm void Library::Func(int n) { cout &lt;&lt; &quot;n...

Общая ф-ция для классов - C++
Функцию, например, MyFunck мне нужно использовать в нескольких классах. Но объявлять и описывать ее заново в каждом классе не хочется. ...


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

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

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