быдлокодер
1722 / 909 / 106
Регистрация: 04.06.2008
Сообщений: 5,644
|
|||||||||||
1 | |||||||||||
В конструкторе вложенного класса инициализируется приватное поле. Потом вызывается функция-метод этого класса и выводит значение этого поля НО НЕ ТО!08.06.2011, 00:24. Показов 3691. Ответов 21
Метки нет Все метки)
(
Друзья! Почему так?
ob_1.B_() и я с её помощью очень хочу увидеть ноль, но не вижу. Почему, друзья? Добавлено через 1 минуту Последний код читать: ob_1.B_()(6); Исправленному верить!!!
0
|
|
08.06.2011, 00:24 | |
Ответы с готовыми решениями:
21
Можно ли сделать поле класса параметром функции-члена этого же класса? Как вызвать метод класса в другом методе этого же класса? Может ли метод класса возвращать экземпляр этого же класса? Как вызвать виртуальную функцию из дочернего класса, если она определена и вызывается в конструкторе РОДИТЕЛЬСКОГО класса? |
![]() 5052 / 3113 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
|
||||||
08.06.2011, 11:32 | 2 | |||||
Я несколько не понял некоторые участки вашего кода, поэтому пока выложу код, который выполняет то, что, как я понял, вам надо:
1
|
186 / 173 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
||||||||||||||||||||||||||
08.06.2011, 11:57 | 3 | |||||||||||||||||||||||||
это как то подозрительно, хороший компилятор должен обругаться
Затем к этой штуке применяется оператор (), который выводит i=0, а аргумент х впринципе никак не влияет на вывод (). Всё логично, что не так? Добавлено через 3 минуты кстати объект, который ты создаёшь таким хитрым способом навсегда теряется в памяти. Наверно лучше сделать что-то типа того
Добавлено через 5 минут ты наверно g++ компилировал. Вроде он позволяет делать функции, которые потом ничего не возвращают. Точнее эта штука
1
|
![]() 5052 / 3113 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
|
|
08.06.2011, 11:57 | 4 |
pito211, куда это он потеряется? Он уничтожится после вызова operator().
1
|
186 / 173 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
|
08.06.2011, 12:01 | 5 |
ну да точно
0
|
быдлокодер
1722 / 909 / 106
Регистрация: 04.06.2008
Сообщений: 5,644
|
|
08.06.2011, 18:07 [ТС] | 6 |
pito211,тут всё под контролем, ничего возвращать не надо, никаких return. Просто надо вызвать конструктор объекта класса B, что и делается; g++ так разрешает что возвращается не знаю, не интересовался. А вот почему надо в объявлении писать, что функция возвращает B- загадка, иначе ругань.
0
|
![]() 5052 / 3113 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
|
|
08.06.2011, 18:10 | 7 |
kravam, а чем мой вариант не подходит? Вам обязательно надо было, чтобы класс A не содержал экземпляра класса B? А то так и конструктор естественнее вызывается.
0
|
быдлокодер
1722 / 909 / 106
Регистрация: 04.06.2008
Сообщений: 5,644
|
|
08.06.2011, 18:16 [ТС] | 8 |
0
|
186 / 173 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
||||||
08.06.2011, 18:32 | 9 | |||||
а что она должна возвращать? только B
если она как void будет объявлена, то эта штука возвращает void, а для войда вроде как нет оператора(), на что компилятор и указывает Добавлено через 7 минут
1
|
быдлокодер
1722 / 909 / 106
Регистрация: 04.06.2008
Сообщений: 5,644
|
||||||||||||||||
08.06.2011, 18:46 [ТС] | 10 | |||||||||||||||
silent_1991,размышляю. Дело в том, что мне в конструкторе не надо передавать значение int (бессмысленн). То есть у меня создаются функции-методы, которые принимают параметрами переменную int
И вот, я должен быть уверен, что во внутреннем классе b есть приватное поле, которое становится равным 89; pito211 сподобил на рабочее
pito211,пожалуй, что соглашусь, почему пожалуй, потому, что наблюдаем вызов конструктора классе безо всякого возвращения объекта, тем не менее, к "невозвращённому объекту" применима "operator ()"
Хотя, наверное в этом коде тоже присутствует возвращение объекта, просто оно неявное и скрыто где-то внутри кода конструктора и чтобы оно было, компилятор сам заботится об этом, угу?
0
|
![]() 5052 / 3113 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
|
|
08.06.2011, 18:56 | 11 |
kravam, ну тогда инициализируйте m_a дефолтным значением, а потом, через operator() передавайте нужный параметр. В остальном код отличаться не будет.
Добавлено через 2 минуты pito211, вообще, если не ошибаюсь, деструктор вызовется после возвращения объекта из функции, однако сразу по возвращении к объекту применяется operator(), поэтому деструктор будет вызван после них.
0
|
быдлокодер
1722 / 909 / 106
Регистрация: 04.06.2008
Сообщений: 5,644
|
|
08.06.2011, 19:19 [ТС] | 12 |
silent_1991, понятно. Для моей задачи это не подходит вот ещё по какой причине: у меня вложенный класс суть заменитель функции метода. Функция метод вызывается когда она вызывается в коде, а в предложеном вами варианте объект вложенного класса будет вызываться в момент создания объемлюющего объекта. Следовательно, и удаляться будет вместе со своими полями и методами когда будет удалён объемлющий объект, а мне это не подходит, а сейчас пойдут дебри, я их не объяснял просто:
Тут всё завязано со статическими переменными и рекурсивной функцией operator ()... Короче, парни вам это наверное неинтересно, но вы реально круты.
0
|
![]() 5052 / 3113 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
|
|
08.06.2011, 19:39 | 13 |
kravam, создайте статический объект класса B)))
0
|
быдлокодер
1722 / 909 / 106
Регистрация: 04.06.2008
Сообщений: 5,644
|
||||||||||||||||
08.06.2011, 20:02 [ТС] | 14 | |||||||||||||||
Имеем:
Рекурсивную функцию-метод, 1)вызывает сама 5 раз (это для простоты, цикл отменяется) 2)Счётчик- статическое поле i, инкременируется в теле функции 3)принимает переменную типа int синтаксис:
++++++++++++++++++++++++++++++++++++++++++++++++++ ++++ 1)вызывается рекурсивная функция "operator ()" 5 раз (это для простоты, цикл отменяется) 2)Счётчик- статическое поле privat i, инициализируется в конструкторе 3)Конструктор принимает переменную типа int синтаксис:
++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++ Исходя из вышенаписанного: что даст? Добавлено через 1 минуту самое главное- что рекурсивно 5 раз, иначе и заморочек не было бы
0
|
186 / 173 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
|
08.06.2011, 20:23 | 15 |
какие то ты страшные вещи творишь. Интуитивно не понятно, что делает оепратор () и тем более такая конструкция ob.f_rek(100)();
лучше создай статический объект как член класса А, как тебе рекомендовал silent_1991. Тогда он внешне будет вести себя как метод. Для этого собственно и перегружают оператор(), а не для таких извращений ob.f_rek(100)();
0
|
![]() 5052 / 3113 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
|
||||||
08.06.2011, 20:30 | 16 | |||||
Такая рекурсия не катит?
0
|
быдлокодер
1722 / 909 / 106
Регистрация: 04.06.2008
Сообщений: 5,644
|
||||||
08.06.2011, 20:40 [ТС] | 17 | |||||
Не катит абсолютно. Вы поймите мне нужен более или менее единообразный интерфейс. То есть:
создание объекта, вызов функции метода, которая определена для этого объекта. (И она должна быть объявлена в теле класса ещё. Чтобы класс был полон и всё объявления присутствовали в нём)
rec_func_five_timesпри всей её работоспособности она сама по себе, она не метод.
0
|
![]() 5052 / 3113 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
|
|
08.06.2011, 20:44 | 18 |
kravam, и что мешает сделать её методом?
0
|
быдлокодер
1722 / 909 / 106
Регистрация: 04.06.2008
Сообщений: 5,644
|
||||||||||||||||
08.06.2011, 21:06 [ТС] | 19 | |||||||||||||||
Ну я делал-делал, делал-делал, в результате появилась эта тема.
Я же говорю: В функции должно быть определена статическая переменная. Блин
Да не пойдёт же
0
|
![]() 5052 / 3113 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
|
||||||
08.06.2011, 21:12 | 20 | |||||
Похоже, я просто не могу понять, чего вы добиваетесь...
1
|
08.06.2011, 21:12 | |
Помогаю со студенческими работами здесь
20
Обращение к классу через поле этого класса Как вызвать метод вложенного класса в методе родительского класса Создать шаблонный класс и наследованный от этого класса метод
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |