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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,481
#1

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

08.06.2011, 00:24. Просмотров 2159. Ответов 21
Метки нет (Все метки)

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

Может ли метод класса возвращать экземпляр этого же класса? - C++
такой вопрос, реально что бы функция класса имела тип класса(возвращала класс), то есть типа так: class c1{ c1 f1(); } если да, то...

Как вызвать виртуальную функцию из дочернего класса, если она определена и вызывается в конструкторе РОДИТЕЛЬСКОГО класса? - C++
Ну то есть так: есть родительский и дочерний класс, в родительском определен виртуальная функция и вызывается в его конструкторе (камень...

Создать шаблонный класс и наследованный от этого класса метод - C++
Создать шаблонный класс и наследованный от этого класса метод(естественно шаблонный), реализовать его в int main(){} через INT и Double.

Сам вопрос: почему функция-член одного класса не вызывается из функции-члена другого класса? - C++
//Щас всё объясню. Так, имеем два класса, в одном я определил функцию-член. Все конструкторы и прочее //опущены для уменьшения кода ...

Возможно ли создание объекта шаблонного класса в функции этого класса? - C++
Доброго времени суток, уважаемые форумчане :) Мне по лабам задали задание - реализовать шаблон контейнера (множество) с операциями...

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

21
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.06.2011, 20:30 #16
Такая рекурсия не катит?

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
#include <iostream>
 
void rec_func_five_times(int x)
{
    static int i = 0;
 
    if (i == 5)
    {
        i = 0;
 
        std::cout << std::endl;
 
        return;
    }
 
    std::cout << x << "  ";
 
    ++i;
 
    rec_func_five_times(x + 1);
}
 
int main()
{
    rec_func_five_times(1);
    rec_func_five_times(2);
    rec_func_five_times(3);
 
    return 0;
}
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,481
08.06.2011, 20:40  [ТС] #17
Не катит абсолютно. Вы поймите мне нужен более или менее единообразный интерфейс. То есть:
создание объекта, вызов функции метода, которая определена для этого объекта. (И она должна быть объявлена в теле класса ещё. Чтобы класс был полон и всё объявления присутствовали в нём)
C++
1
2
3
Ob ob;
ob.f_0(); 
ob.f_1_rek(5)();
А функция
rec_func_five_timesпри всей её работоспособности она сама по себе, она не метод.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.06.2011, 20:44 #18
kravam, и что мешает сделать её методом?
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,481
08.06.2011, 21:06  [ТС] #19
Ну я делал-делал, делал-делал, в результате появилась эта тема.
Я же говорю: В функции должно быть определена статическая переменная. Блин
C++
1
2
ob.rec_func_five_times (90);
ob.rec_func_five_times (89);
ВСё, приплыли. Первый вызов отработает 5 раз. А второй? 0 раз! Ибо i будет равна 5! А мне всякий раз нудо чтобы i была равна 0! При каждом таком вызове!
C++
1
2
3
ob.rec_func_five_times (90);
ob.rec_func_five_times (89);
ob.rec_func_five_times (35);

Цитата Сообщение от pito211 Посмотреть сообщение
лучше создай статический объект как член класса А, как тебе рекомендовал silent_1991. Тогда он внешне будет вести себя как метод.
Да не пойдёт же
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
class A {
 class B {;
  public:
   B ():i(0) {};
 
  private:
   int i;          
 };
 static B b;
};        
 
int main(){
    getchar ();
    return 0;
}
И по этому вопросу я говорил уже: B создастся при создании класса A ОДИН РАЗ и приватная переменная i обнуляться НЕ БУДЕТ
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.06.2011, 21:12 #20
Похоже, я просто не могу понять, чего вы добиваетесь...

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
#include <iostream>
 
class Foo
{
public:
    void rec_method_five_times(int x)
    {
        static int i = 0;
 
        if (i == 5)
        {
            i = 0;
 
            std::cout << std::endl;
 
            return;
        }
 
        std::cout << x << "  ";
 
        ++i;
 
        rec_method_five_times(x + 1);
    }
};
 
int main()
{
    Foo bar;
 
    bar.rec_method_five_times(1);
    bar.rec_method_five_times(2);
    bar.rec_method_five_times(3);
 
    return 0;
}
1
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,481
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 ;
};
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Кошмар.
Спасибо всем большое, если чё, я отпишусь тут ещё.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.06.2011, 21:57 #22
kravam, функция действительно этим недостатком обладает))) Просто тут так не выйти из положения, вы точно знаете, что ваша функция вызовется пять раз, поэтому можно статическую переменную после этих пяти раз обнулить, а у автора неизвестно, с какими массивами будет работать функция. Вдруг в этот раз ей надо обработать массив из 5 элементов, а в следующий раз - из 7. Когда обнулять? Неизвестно. Поэтому здесь действительно нужен функтор.
0
08.06.2011, 21:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2011, 21:57
Привет! Вот еще темы с ответами:

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

Создание статической функции класса, которая принимает экземпляр этого же класса как объект - C++
Привет. Есть такой код class Model { public: Model(); Model(int verticesSize, int facesSize); ~Model(); static void...

Индексация массива класса, через объект этого класса - C++
class A{ char c;//? - размер массива public: A(int C){c;} }; int main(){ A a(5);//вносим размер массива getch(); ...

Как сделать членом класса экземпляр этого же класса - C++
class Operation { public: bool type; //true = operation, false = number char Operator; Operation L_Op; Operation R_Op; ...


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

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

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