На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 200 201 [202] 203 204 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Цитата trainer @
    Цитата D_KEY @
    Самый простой вариант - использовать измененную .h-ку, с public вместо private.
    Проблема в том, что члены класса могут расположиться в памяти иначе.

    С чего вдруг? Члены класса могут располагаться иначе, только если перед каждым полем(или группами) указан спецификатор. Выравнивание же не связано с public/private/protected.
    Сообщение отредактировано: D_KEY -
      Цитата D_KEY @
      Члены класса могут располагаться иначе, только если перед каждым полем(или группами) указан спецификатор.
      Так ты же меняешь спецификаторы - значит они указаны. Если они не указаны - то что изменит замена private на public?
      ExpandedWrap disabled
        class CMyClass {
           int a;
           void b(int arg);
        public:
           CMyClass();
        };
      Сообщение отредактировано: trainer -
        Цитата trainer @
        Цитата D_KEY @
        Члены класса могут располагаться иначе, только если перед каждым полем(или группами) указан спецификатор.
        Так ты же меняешь спецификаторы - значит они указаны.

        Было:
        ExpandedWrap disabled
          class A
          {
          public:
          ...
          private:
              int x;
              int y;
          };


        Стало:
        ExpandedWrap disabled
          class A
          {
          public:
          ...
          public:
              int x;
              int y;
          };

        Согласно стандарту x и y должны следовать друг за другом, а на выравнивание public/private не влияют.
          Цитата D_KEY @
          С чего вдруг это неопределенное поведение? Если ошибаюсь - поправь.

          Во-первых, ты нарушаешь ODR. Поэтому, даже если и слинкуется, то trainer уже объяснил: во-вторых, гарантируется порядок следования полей только для одной секции (privete/protected/public). Если ты меняешь их объявления, то компилятор вправе расположить поля иначе - нарушения бинарной совместимости - неопределённое поведение.
            Цитата MyNameIsIgor @
            Цитата D_KEY @
            Ну, "добраться до потрохов", можно и в С++

            У тебя есть .h и .obj. Твои действия?

            допустим
            foo.h:
            ExpandedWrap disabled
              class Foo {
              private:
                  int x;
              public:
                  int get_x ();
              };

            foo.cpp:
            ExpandedWrap disabled
              #include "foo.h"
               
              int Foo::get_x () {
                  return x;
              }

            test.cpp:
            ExpandedWrap disabled
              #include <iostream>
              #include "foo.h"
               
              int main () {
                  Foo foo;
                  std::cout << foo.get_x() << std::endl;
              }


            ExpandedWrap disabled
              [ ~/devel/c++ ] g++ -Wall -c foo.cpp
              [ ~/devel/c++ ]

            теперь имеем foo.h, foo.o и test.cpp

            меняем foo.h:
            ExpandedWrap disabled
              class Foo {
              private:
                  int x;
              public:
                  void set_x (int new_x) { x = new_x; }
                  int get_x ();
              };

            test.cpp:
            ExpandedWrap disabled
              #include <iostream>
              #include "foo.h"
               
              int main () {
                  Foo foo;
                  std::cout << foo.get_x() << std::endl;
                  foo.set_x( 2 );
                  std::cout << foo.get_x() << std::endl;
              }

            компилируем и запускаем:
            ExpandedWrap disabled
              [ ~/devel/c++ ] g++ -Wall -o test foo.o test.cpp
              [ ~/devel/c++ ] ./test
              -1218502668
              2
              [ ~/devel/c++ ]


            так что там про инкапсуляцию?
              Цитата trainer @
              Цитата D_KEY @
              Члены класса могут располагаться иначе, только если перед каждым полем(или группами) указан спецификатор.
              Так ты же меняешь спецификаторы - значит они указаны. Если они не указаны - то что изменит замена private на public?
              ExpandedWrap disabled
                class CMyClass {
                   int a;
                   void b(int arg);
                public:
                   CMyClass();
                };

              Ты можешь изменить .h и добавить тут public. Я не говорю, что так делать правильно и нужно :)
                korvin, вы тоже нарушаете ODR, это тоже неопределённое поведение - разговор закончен.
                  Цитата MyNameIsIgor @
                  Цитата D_KEY @
                  С чего вдруг это неопределенное поведение? Если ошибаюсь - поправь.

                  Во-первых, ты нарушаешь ODR.

                  Уверен?

                  Цитата
                  Поэтому, даже если и слинкуется, то trainer уже объяснил: во-вторых, гарантируется порядок следования полей только для одной секции (privete/protected/public). Если ты меняешь их объявления, то компилятор вправе расположить поля иначе - нарушения бинарной совместимости - неопределённое поведение.
                  Да, гарантирует и я не добавляю, а изменяю.
                    Цитата D_KEY @
                    Ты можешь изменить .h и добавить тут public.
                    Это был пример на твоё
                    Цитата D_KEY @
                    Ну или так:
                    ExpandedWrap disabled
                          #define private public
                          #include "MyHeader.h"

                      Цитата D_KEY @
                      Уверен?

                      Лол?
                      Цитата D_KEY @
                      Да, гарантирует и я не добавляю, а изменяю.

                      А я где сказал "добавляешь"? Именно, ты меняешь - это другой тип - компилятор располагает поля как хочет.

                      Добавлено
                      И, да, я специально не упоминаю pimpl, ибо тогда вообще всё будет крайне уныло :lol:
                      Сообщение отредактировано: MyNameIsIgor -
                        Цитата MyNameIsIgor @
                        Цитата D_KEY @
                        Уверен?

                        Лол?

                        Нет. Просто не вижу, где бы тут было нарушение ODR с точки зрения формального определения.
                        Хотя, скорее всего, ты прав, а мне должно быть стыдно :blush:

                        Цитата
                        Цитата D_KEY @
                        Да, гарантирует и я не добавляю, а изменяю.

                        А я где сказал "добавляешь"? Именно, ты меняешь - это другой тип - компилятор располагает поля как хочет.

                        Секция по прежнему одна, значит порядок по прежнему гарантируется.

                        Добавлено
                        Цитата MyNameIsIgor @
                        И, да, я специально не упоминаю pimpl, ибо тогда вообще всё будет крайне уныло :lol:

                        Конечно. Собственно речь шла о том, что если захочешь, то сделаешь(пусть и не по стандарту, а для конкретного компилятора). Язык не может защитить от глупости или преднамеренных хаков.
                          Цитата MyNameIsIgor @
                          korvin, вы тоже нарушаете ODR, это тоже неопределённое поведение - разговор закончен.

                          т.е. никакой гаранттии инкапсуляции классы не дают? замечательно...
                            Цитата D_KEY @
                            Секция по прежнему одна, значит порядок по прежнему гарантируется.
                            Ты гарантируешь, что в любом классе она одна? А ничего, что у тебя видимо появились две public ?
                              Цитата korvin @
                              Цитата MyNameIsIgor @
                              korvin, вы тоже нарушаете ODR, это тоже неопределённое поведение - разговор закончен.

                              т.е. никакой гаранттии инкапсуляции классы не дают? замечательно...

                              А они должны давать гарантии? Спецификаторы доступа нужны только для описания и контроля за случайными ошибками программистов.
                                Цитата D_KEY @
                                Нет. Просто не вижу, где бы тут было нарушение ODR с точки зрения формального определения.
                                Хотя, скорее всего, ты прав, а мне должно быть стыдно

                                Прекрати. Obj скомпилирован с одним ашником, а твой cpp - с другим (даже если ты "изменил" его с поммощью препроцессора). В результате у тебя линкуется два объектника, которые скомпилированы с двумя разными типами с однинаковым названием. Это не нарушение ODR?
                                Цитата D_KEY @
                                Секция по прежнему одна, значит порядок по прежнему гарантируется.

                                Порядок секций не гарантируется! Только порядок полей внутри секций. Если ты меняешь private на public, то компилятор вправе переставить секции местами, если ему так удобнее.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 200 201 [202] 203 204 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.3654 ]   [ 15 queries used ]   [ Generated: 1.08.26, 06:47 GMT ]