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

В конструкторе вложенного класса инициализируется приватное поле. Потом вызывается функция-метод этого класса и выводит значение этого поля НО НЕ ТО! - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
08.06.2011, 00:24     В конструкторе вложенного класса инициализируется приватное поле. Потом вызывается функция-метод этого класса и выводит значение этого поля НО НЕ ТО! #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
41
#include <windows.h>
#include <iostream>
using namespace std;
 
 
//Вот главный класс
class A{
 private:
 
 //А вот вложенный
 class B { 
  public: 
 
   //А вот инициализация приватного члена i вложенного класса
   B(): i(0){} 
   void operator()(int x){ 
 
    //Ну всё, собсно. Конструктор B создан, i инициализирована должны увидеть 0
    //вместо этого видим чушь
    printf ("i= %d\n", i);
    getchar ();
   } 
  private: 
   int i ; 
 }; 
 
 public:
  A (){};
 
  //А это отдельный разговор, компилится только если возвращает объект типа B
  B B_() {
   B();
  }
};
   
 
int main() {
 A ob_1;
 ob_1.B_()(6);
 system ("pause");
}
Немного по главной функции; итак вызывается конструктор вложенного класса
C++
1
ob_1.B_()
Понятное дело, i должна обнулиться. Так, тут же вызывается фунция переопределения оператора
ob_1.B_()
и я с её помощью очень хочу увидеть ноль, но не вижу. Почему, друзья?

Добавлено через 1 минуту
Последний код читать:
ob_1.B_()(6);
Исправленному верить!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2011, 00:24     В конструкторе вложенного класса инициализируется приватное поле. Потом вызывается функция-метод этого класса и выводит значение этого поля НО НЕ ТО!
Посмотрите здесь:

C++ Сам вопрос: почему функция-член одного класса не вызывается из функции-члена другого класса?
C++ Как вызвать виртуальную функцию из дочернего класса, если она определена и вызывается в конструкторе РОДИТЕЛЬСКОГО класса?
Возможно ли создание объекта шаблонного класса в функции этого класса? C++
Как сделать членом класса экземпляр этого же класса C++
Создание статической функции класса, которая принимает экземпляр этого же класса как объект C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
08.06.2011, 21:52  [ТС]     В конструкторе вложенного класса инициализируется приватное поле. Потом вызывается функция-метод этого класса и выводит значение этого поля НО НЕ ТО! #21
Мда уж... Мне в голову не приходило, что переменной static можно присвоить какое-то иное значение кроме начального, ни разу с этим не сталкивался. Просто я ни разу не сталкивался, с рекурсивной функцией, которая вызывается несколько раз. Просто вроде, а вот поди ж ты... Да ещё и старина Аммерааль подлил масла в огонь, а я некритически отнёсся к авторитету. Вот текст из его книги, сдуто с формата djvu.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Мы можем использовать алгоритм for_each для вызова функции с каждым
из элементов последовательности в качестве аргумента. Вот программа,
которая демонстрирует это:
// for_each.cpp: Алгоритм for_each.
#include <iostream>
#include <algorithm>
using namespace std;
void display(int x){
static int i=0;
cout << "a[" << i++ << "] = " << x << endl;
}

int main()
{ const int N = 4;
int a[N] = {1234, 5432, 8943, 3346};
for_each(a, a+N, display);
return 0;
}

Эта программа работает точно так же, как если бы мы заменили вызов
for_each следующим оператором for.
for (int *р=а; р != a+N; р++)
display(*р);

В любом случае программа выведет
а[0] = 1234
а[1] = 5432
а[2] = 8943
а[3] = 3346

Функция display в этом примере обладает существенным недостатком:
переменная i равна нулю только тогда, когда эта функция вызывается в первый
раз.
Например, еще один такой же вызов for_each в функции main приведет
к ошибке, поскольку при повторном вызове функция display не начнет с i = 0.
Мы можем решить эту проблему с помощью функционального объекта.
Заменим функцию display следующим определением класса:


class display {
public:
display(): i(0){)
void operator()(int x)
{ cout << "a[n" << i++ <<"]=" << x << endl;
}
private:
int i ;
};
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Кошмар.
Спасибо всем большое, если чё, я отпишусь тут ещё.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2011, 21:57     В конструкторе вложенного класса инициализируется приватное поле. Потом вызывается функция-метод этого класса и выводит значение этого поля НО НЕ ТО!
Еще ссылки по теме:

Построение описания класса, создание и уничтожение объектов этого класса C++
C++ Создать объект внутри класса, который может вызывать функцию этого класса
C++ Создать шаблонный класс и наследованный от этого класса метод

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
08.06.2011, 21:57     В конструкторе вложенного класса инициализируется приватное поле. Потом вызывается функция-метод этого класса и выводит значение этого поля НО НЕ ТО! #22
kravam, функция действительно этим недостатком обладает))) Просто тут так не выйти из положения, вы точно знаете, что ваша функция вызовется пять раз, поэтому можно статическую переменную после этих пяти раз обнулить, а у автора неизвестно, с какими массивами будет работать функция. Вдруг в этот раз ей надо обработать массив из 5 элементов, а в следующий раз - из 7. Когда обнулять? Неизвестно. Поэтому здесь действительно нужен функтор.
Yandex
Объявления
08.06.2011, 21:57     В конструкторе вложенного класса инициализируется приватное поле. Потом вызывается функция-метод этого класса и выводит значение этого поля НО НЕ ТО!
Ответ Создать тему
Опции темы

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