С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705

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

08.06.2011, 00:24. Показов 4689. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.06.2011, 00:24
Ответы с готовыми решениями:

Можно ли сделать поле класса параметром функции-члена этого же класса?
Здраствуйте. ref class MyClass { private: int i, j; array&lt;array&lt;int&gt;^&gt;^ X1; array&lt;array&lt;int&gt;^&gt;^ X2; public: ...

Как вызвать метод класса в другом методе этого же класса?
&lt;? class load_files{ public function traverse_hierarchy($path) { // from...

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

21
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.06.2011, 11:32
Я несколько не понял некоторые участки вашего кода, поэтому пока выложу код, который выполняет то, что, как я понял, вам надо:

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
42
43
44
45
#include <iostream>
 
class A
{
    class B
    { 
    public:
        B(int b):
        m_b(b)
        {
        } 
    
        void operator()()
        {
            std::cout << "m_b = " << m_b << std::endl;
        }
    
    private: 
        int m_b; 
    };
 
public:
    A(int a):
    m_a(a)
    {
    }
 
    B get_a() const
    {
        return m_a;
    }
 
private:
    B m_a;
};
   
 
int main()
{
    A a(10);
 
    a.get_a()();
 
    return 0;
}
1
 Аватар для pito211
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
08.06.2011, 11:57
это как то подозрительно, хороший компилятор должен обругаться
C++
1
2
3
4
B B_() {
 
   B();
  }
функция ничего не возвращает. Наверно ты хотел
C++
1
2
3
4
B B_() {
 
   return B();
  }
тогда вот эта штука
C++
1
ob_1.B_()
создаст объект класса B, c проинициализированной i = 0.
Затем к этой штуке применяется оператор (), который выводит i=0, а аргумент х впринципе никак не влияет на вывод (). Всё логично, что не так?

Добавлено через 3 минуты
кстати объект, который ты создаёшь таким хитрым способом навсегда теряется в памяти. Наверно лучше сделать что-то типа того
C++
1
2
B &b = ob_1.B_();
b.operator(6);
чтобы с ним работать потом можно было. Ещё меня смущает return B(); мне кажется надо создать в динамической памяти и вернуть на него ссылку, а то как то опасно это выглядит

Добавлено через 5 минут
ты наверно g++ компилировал. Вроде он позволяет делать функции, которые потом ничего не возвращают. Точнее эта штука
C++
1
2
3
4
B B_() {
 
   B();
  }
наверняка что-нибудь вернула, надо посмотреть в дизасме, у меня в ВС это просто не компилируется. Какой-нибудь левый дефолтный адресс, по которому естественно никакого объекта B и впомине не было, соответсвенно i в нём не определенна. Я так думаю
1
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.06.2011, 11:57
pito211, куда это он потеряется? Он уничтожится после вызова operator().
1
 Аватар для pito211
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
08.06.2011, 12:01
ну да точно
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
08.06.2011, 18:07  [ТС]
pito211,тут всё под контролем, ничего возвращать не надо, никаких return. Просто надо вызвать конструктор объекта класса B, что и делается; g++ так разрешает что возвращается не знаю, не интересовался. А вот почему надо в объявлении писать, что функция возвращает B- загадка, иначе ругань.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.06.2011, 18:10
kravam, а чем мой вариант не подходит? Вам обязательно надо было, чтобы класс A не содержал экземпляра класса B? А то так и конструктор естественнее вызывается.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
08.06.2011, 18:16  [ТС]
Цитата Сообщение от pito211 Посмотреть сообщение
кстати объект, который ты создаёшь таким хитрым способом навсегда теряется в памяти.
//.............
Какой-нибудь левый дефолтный адресс, по которому естественно никакого объекта B и впомине не было, соответсвенно i в нём не определенна. Я так думаю
молодец,
C++
1
2
3
  B B_() {
   return B();
  }
помогает, посмотрим, что дальше будет.
0
 Аватар для pito211
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
08.06.2011, 18:32
Цитата Сообщение от kravam Посмотреть сообщение
А вот почему надо в объявлении писать, что функция возвращает B- загадка, иначе ругань.
а что она должна возвращать? только B
если она как void будет объявлена, то эта штука
Цитата Сообщение от kravam Посмотреть сообщение
ob_1.B_()
возвращает void, а для войда вроде как нет оператора(), на что компилятор и указывает

Добавлено через 7 минут
C++
1
2
3
4
B B_() 
{
 B();
} /*деструктор вызовется тут, поэтому смысла особого нет в этой функции, она вернёт непонятно чё. И приминение оператора() к этому "непонятно чему" ведёт к непредсказуемым последствиям, в лучшем случае выведет кривой i, в худшем SIGSEV. Поэтому return необходим*/
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
08.06.2011, 18:46  [ТС]
silent_1991,размышляю. Дело в том, что мне в конструкторе не надо передавать значение int (бессмысленн). То есть у меня создаются функции-методы, которые принимают параметрами переменную int
C++
1
2
3
4
5
6
 A ob_1;
 ob_1.B_(89)();
 ob_1.B_(12)();
 ob_1.B_(34)();
 ob_1.B_(42)();
 //И так далее, не конструктор принимает int, а метод!
Повоторяю, это для интерфейса.
И вот, я должен быть уверен, что во внутреннем классе b есть приватное поле, которое
становится равным 89; pito211 сподобил на рабочее

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
#include <windows.h>
#include <iostream>
using namespace std;
 
 
//Вот главный класс
class A{
 private:
 
 //А вот вложенный
 class B { 
  public: 
 
   //А вот инициализация приватного члена i вложенного класса
   B(int z): i(z){} 
   void operator()(){ 
 
    //Была чушь, теперь чё надо!!
    printf ("i= %d\n", i);
    getchar ();
   } 
  private: 
   int i ; 
 }; 
 
 public:
  A (){};
  B B_(int z) {
   return B(z);
  }
};
   
 
int main() {
 A ob_1;
 ob_1.B_(89)();
 system ("pause");
}
Добавлено через 14 минут
pito211,пожалуй, что соглашусь, почему пожалуй, потому, что наблюдаем вызов конструктора классе безо всякого возвращения объекта, тем не менее, к "невозвращённому объекту" применима "operator ()"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <windows.h>
#include <iostream>
using namespace std;
 
class A{
 public:
  int operator () (int x) {
   return x;
  }         
};
   
 
int main() {
 //Вот здесь
 printf ("A()(6)= %d\n", A()(6));
 system ("pause");
}
,
Хотя, наверное в этом коде тоже присутствует возвращение объекта, просто оно неявное и скрыто где-то внутри кода конструктора и чтобы оно было, компилятор сам заботится об этом, угу?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.06.2011, 18:56
kravam, ну тогда инициализируйте m_a дефолтным значением, а потом, через operator() передавайте нужный параметр. В остальном код отличаться не будет.

Добавлено через 2 минуты
pito211, вообще, если не ошибаюсь, деструктор вызовется после возвращения объекта из функции, однако сразу по возвращении к объекту применяется operator(), поэтому деструктор будет вызван после них.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
08.06.2011, 19:19  [ТС]
silent_1991, понятно. Для моей задачи это не подходит вот ещё по какой причине: у меня вложенный класс суть заменитель функции метода. Функция метод вызывается когда она вызывается в коде, а в предложеном вами варианте объект вложенного класса будет вызываться в момент создания объемлюющего объекта. Следовательно, и удаляться будет вместе со своими полями и методами когда будет удалён объемлющий объект, а мне это не подходит, а сейчас пойдут дебри, я их не объяснял просто:

Тут всё завязано со статическими переменными и рекурсивной функцией operator ()... Короче, парни вам это наверное неинтересно, но вы реально круты.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.06.2011, 19:39
kravam, создайте статический объект класса B)))
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
08.06.2011, 20:02  [ТС]
Имеем:
Рекурсивную функцию-метод,
1)вызывает сама 5 раз (это для простоты, цикл отменяется)
2)Счётчик- статическое поле i, инкременируется в теле функции
3)принимает переменную типа int
синтаксис:
C++
1
ob.f_rek(100);
Так, а повторный вызов
C++
1
ob.f_rek(100);
приведёт к краху, ибо i== 4. Поэтому ищем такой функции аналог объект вложенного класса
++++++++++++++++++++++++++++++++++++++++ ++++++++++++++
1)вызывается рекурсивная функция "operator ()" 5 раз (это для простоты, цикл отменяется)
2)Счётчик- статическое поле privat i, инициализируется в конструкторе
3)Конструктор принимает переменную типа int

синтаксис:
C++
1
ob.f_rek(100)();
по-моему очень симпатичиный вызов, повторный вызов к краху не приведёт, ибо создастся НОВЫЙ объект f_rek, где i==0.
++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++
Исходя из вышенаписанного:
Цитата Сообщение от silent_1991 Посмотреть сообщение
kravam, создайте статический объект класса B)))
что даст?

Добавлено через 1 минуту
самое главное- что рекурсивно 5 раз, иначе и заморочек не было бы
0
 Аватар для pito211
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
08.06.2011, 20:23
какие то ты страшные вещи творишь. Интуитивно не понятно, что делает оепратор () и тем более такая конструкция ob.f_rek(100)();
лучше создай статический объект как член класса А, как тебе рекомендовал silent_1991. Тогда он внешне будет вести себя как метод. Для этого собственно и перегружают оператор(), а не для таких извращений ob.f_rek(100)();
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.06.2011, 20:30
Такая рекурсия не катит?

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
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
08.06.2011, 20:40  [ТС]
Не катит абсолютно. Вы поймите мне нужен более или менее единообразный интерфейс. То есть:
создание объекта, вызов функции метода, которая определена для этого объекта. (И она должна быть объявлена в теле класса ещё. Чтобы класс был полон и всё объявления присутствовали в нём)
C++
1
2
3
Ob ob;
ob.f_0(); 
ob.f_1_rek(5)();
А функция
rec_func_five_timesпри всей её работоспособности она сама по себе, она не метод.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.06.2011, 20:44
kravam, и что мешает сделать её методом?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
08.06.2011, 21:06  [ТС]
Ну я делал-делал, делал-делал, в результате появилась эта тема.
Я же говорю: В функции должно быть определена статическая переменная. Блин
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
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.06.2011, 21:12
Похоже, я просто не могу понять, чего вы добиваетесь...

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.06.2011, 21:12
Помогаю со студенческими работами здесь

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

Как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса?
Подскажите, пожалуйста, как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса. Буду очень...

Как получить значение поля класса Окна в классе Контроллера для этого окна?
Доброго всем времени суток. Есть вот такая ситуация. Создаю окна, путем загрузки разметки из fxml файла. public class guiWindow{ ...

Обращение к классу через поле этого класса
Как обратиться к классу через его поле?

Как вызвать метод вложенного класса в методе родительского класса
Имеется родительский класс для прорисовки графики Jogj package objects; import com.jogamp.opengl.GL2; import...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru