На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (14) « Первая ... 9 10 [11] 12 13 ... Последняя » все  ( Перейти к последнему сообщению )  
> Классы в СИ++ , нужна консультация
    Цитата shm @
    он же третий.
    Тогда почему ты не могу внятно ответить про вывод? Киля просто признайся, что ты был не прав и все. Выглядишь сейчас смешно.

    В чем я конкретно не прав, поясни плз? Если ты мне пояснишь - в чем моя ошибка, я признаю, что я не прав. Посмотри на свой третий пример, и на :
    Цитата KILLER @
    Then, non-static data members shall be initialized in the order they were declared in the class definition


    Добавлено
    И пожалуйста, когда будешь объяснять мне - в чем я не прав, поясни, почему мой пример со статической функцией валица на этапе исполнения? Я не понимаю - я серьезно тебе говорю. По твоей логике - оно должно работать, я же память для переменной выделяю, разве нет?
      Киля. Я тебе перевожу дословно: не статические члены класса в списке инициализации инициализируются в порядке их декларации (т.е. определения в классе, и независимо от их расположения в списке инициализации).
      Сообщение отредактировано: shm -
        Цитата shm @
        Киля, ты вбей в гугл трайнслейт то, что я выделил жирным шрифтом в моей первой цитате Стандарта.

        Я тебе и так могу сказать, не смотря на список mem-initializers.

        Добавлено
        Цитата shm @
        Киля. Я тебе перевожу дословно: члены класса в списке инициализации специализируются в порядке их декларации (т.е. определения в классе, и независимо от их расположения в списке инициализации).

        Почему мой пример со статической функцией валица - на этапе исполнения?

        Добавлено
        Цитата shm @
        Я тебе перевожу дословно: члены класса в списке инициализации специализируются в порядке их декларации (т.е. определения в классе, и независимо от их расположения в списке инициализации).

        Что конкретно ты перевел?
          Цитата KILLER @
          А потому что, объясни мне почему тут такое поведение программы:

          Разжевываю: у тебя порядок объявления переменных такой:
          ExpandedWrap disabled
            int a1;
            B* b1;

          Значит согласно процитированному тобой же Стандарту, в списке инициализации сперва инииализируется a1, потом b1 независимо от их фанатического расположения в этом списке.
          далее:
          ExpandedWrap disabled
             : a1(Calculate(b1)), //вот это сработает первым, как я и написал выше, но в этот момент b1 еще не инициализирован
            b1(new B()),
            a3(5)

          Поменяй определение местами т.е.:
          ExpandedWrap disabled
            B* b1;
            int a1;

          если конечно ты там других ошибок не понаделал...

          Добавлено
          Киля, ну не включай дурачка, а. Ну глупо выглядишь.
          Сообщение отредактировано: shm -
            KILLER, shm прав, члены класса инициируются в том порядке, в котором они перечислены в классе. Порядок инициализаторов в заголовке конструктора если и имеет значение, то только тогда, когда для инициализации используются ранее инициализированные поля класса. Поэтому большинство компиляторов выдают тебе диагностическое сообщение, если этот порядок отличается. Не потому, что это ошибка, а потому, что записывая инициализаторы не в том порядке ты сам себя можешь ввести в заблуждение. Хотя и ошибка там может быть.
              Цитата shm @
              Поменяй определение местами т.е.:

              Ты не понимаешь - в моем примере, который ты сейчас пытаешься понять b1 вызывается раньше, чем инициализируется. Ты не смотри на то, что порядок объявления переменных в классе соответствует порядку инициализации. У меня на момент инициализации a1, уже должен передаваться инициализированный и созданный объект b1.

              Добавлено
              Цитата amk @
              KILLER, shm прав, члены класса инициируются в том порядке, в котором они перечислены в классе. Порядок инициализаторов в заголовке конструктора если и имеет значение, то только тогда, когда для инициализации используются ранее инициализированные поля класса. Поэтому большинство компиляторов выдают тебе диагностическое сообщение, если этот порядок отличается. Не потому, что это ошибка, а потому, что записывая инициализаторы не в том порядке ты сам себя можешь ввести в заблуждение. Хотя и ошибка там может быть.

              Хорошо, пусть будет по вашему. Пускай - я не прав. Я признаю. Ок. Поясните мне тогда - почему передавая b1 - у меня нет объекта, хотя я его создаю?
                amk, я уму это уже 5ю(!) страницу пытаюсь объяснить, скорее всего это бесполезно. :(

                Добавлено
                Цитата KILLER @
                Ты не понимаешь - в моем примере, который ты сейчас пытаешься понять b1 вызывается раньше, чем инициализируется.

                Цитата KILLER @
                Ты не смотри на то, что порядок объявления переменных в классе соответствует порядку инициализации.

                Ты уже сам себе противоречишь :wacko:
                  Ведь порядок инициализации - значения не имеет. Значит я ожидаю корректного выполнения программы.

                  Добавлено
                  Цитата shm @
                  Ты уже сам себе противоречишь :wacko:

                  Нет, не противоречу. b1 - инициализируется после a1, но b1 передается в функцию, которая инициализирует a1. Ты можешь мне подробно пояснить - в чем тут косяк или нет?
                    Цитата KILLER @
                    Поясните мне тогда - почему передавая b1 - у меня нет объекта, хотя я его создаю?

                    Потому, что у тебя b1 объявляется позже переменной a1, которую ты в этом месте инициализируешь.

                    Добавлено
                    Цитата KILLER @
                    Значит я ожидаю корректного выполнения программы.

                    :wall: Какое он может быть корректное, если на момент инициализации а1, б1 не инициализирован по определению?
                      Какая разница что я b1 инициализирую после того, как ее передал в a1 через функцию ? Ведь не имеет значения в каком порядке я что инициализирую - у меня по факту сначало вызовется Calculate, прежде чем будет инициализирован a1, соответственно я ожидаю что b1 - на этом этапе уже будет инициализирован. Разве нет?
                        Цитата KILLER @
                        Нет, не противоречу. b1 - инициализируется после a1, но b1 передается в функцию, которая инициализирует a1.

                        Ну. А что тогда спрашиваешь?
                          Цитата shm @
                          Потому, что у тебя b1 объявляется позже переменной a1, которую ты в этом месте инициализируешь.

                          Так ведь разницы нет - в каком порядке инициализируются члены класса

                          Добавлено
                          Цитата shm @

                          :wall: Какое он может быть корректное, если на момент инициализации а1, б1 не инициализирован по определению?

                          Как не инициализирован, если ты мне только что стандартом тыкал?

                          Добавлено
                          Цитата shm @
                          Ну. А что тогда спрашиваешь?

                          Я и спрашиваю потому, что я понимаю так, чо на момент инициализации а1, b1 не инициализирована, а ты мне доказываешь, что не имеет значения в каком порядке все это вызывается в конструкторе, так как оно уже на этом этапе должно быть инициализировано.
                            Цитата KILLER @
                            Какая разница что я b1 инициализирую после того, как ее передал в a1 через функцию ?

                            Там в этой самой функции есть обращение к виртуальной функции, которая не будет работать по невалидному указателю.

                            Добавлено
                            Цитата KILLER @

                            Так ведь разницы нет - в каком порядке инициализируются члены класса

                            Нет.
                            Цитата KILLER @
                            Как не инициализирован, если ты мне только что стандартом тыкал?

                            Так а1 раньше б1 объявлено? - раньше. Тогда, что тебя удивляет, что на момент инициализации а1 б1 не инициализирована.
                            Сообщение отредактировано: shm -
                              Цитата shm @
                              Там в этой самой функции есть обращение к виртуальной функции, которая не будет работать по невалидному указателю.

                              Да причем тут невалидный указатель? Я же под нее память выделяю. Оно уже на момент передачи в Calculate по вашей логике должно быть создано.
                                :popcorn:
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0502 ]   [ 14 queries used ]   [ Generated: 18.05.24, 16:52 GMT ]