Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 200 201 [202] 203 204 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#3016
,
|
|
|
|
С чего вдруг? Члены класса могут располагаться иначе, только если перед каждым полем(или группами) указан спецификатор. Выравнивание же не связано с public/private/protected. |
|
Сообщ.
#3017
,
|
|
|
|
Цитата D_KEY @ Так ты же меняешь спецификаторы - значит они указаны. Если они не указаны - то что изменит замена private на public?Члены класса могут располагаться иначе, только если перед каждым полем(или группами) указан спецификатор. ![]() ![]() class CMyClass { int a; void b(int arg); public: CMyClass(); }; |
|
Сообщ.
#3018
,
|
|
|
|
Цитата trainer @ Цитата D_KEY @ Так ты же меняешь спецификаторы - значит они указаны.Члены класса могут располагаться иначе, только если перед каждым полем(или группами) указан спецификатор. Было: ![]() ![]() class A { public: ... private: int x; int y; }; Стало: ![]() ![]() class A { public: ... public: int x; int y; }; Согласно стандарту x и y должны следовать друг за другом, а на выравнивание public/private не влияют. |
|
Сообщ.
#3019
,
|
|
|
|
Во-первых, ты нарушаешь ODR. Поэтому, даже если и слинкуется, то trainer уже объяснил: во-вторых, гарантируется порядок следования полей только для одной секции (privete/protected/public). Если ты меняешь их объявления, то компилятор вправе расположить поля иначе - нарушения бинарной совместимости - неопределённое поведение. |
|
Сообщ.
#3020
,
|
|
|
|
допустим foo.h: ![]() ![]() class Foo { private: int x; public: int get_x (); }; foo.cpp: ![]() ![]() #include "foo.h" int Foo::get_x () { return x; } test.cpp: ![]() ![]() #include <iostream> #include "foo.h" int main () { Foo foo; std::cout << foo.get_x() << std::endl; } ![]() ![]() [ ~/devel/c++ ] g++ -Wall -c foo.cpp [ ~/devel/c++ ] теперь имеем foo.h, foo.o и test.cpp меняем foo.h: ![]() ![]() class Foo { private: int x; public: void set_x (int new_x) { x = new_x; } int get_x (); }; test.cpp: ![]() ![]() #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; } компилируем и запускаем: ![]() ![]() [ ~/devel/c++ ] g++ -Wall -o test foo.o test.cpp [ ~/devel/c++ ] ./test -1218502668 2 [ ~/devel/c++ ] так что там про инкапсуляцию? |
|
Сообщ.
#3021
,
|
|
|
|
Цитата trainer @ Цитата D_KEY @ Так ты же меняешь спецификаторы - значит они указаны. Если они не указаны - то что изменит замена private на public?Члены класса могут располагаться иначе, только если перед каждым полем(или группами) указан спецификатор. ![]() ![]() class CMyClass { int a; void b(int arg); public: CMyClass(); }; Ты можешь изменить .h и добавить тут public. Я не говорю, что так делать правильно и нужно |
|
Сообщ.
#3022
,
|
|
|
|
korvin, вы тоже нарушаете ODR, это тоже неопределённое поведение - разговор закончен.
|
|
Сообщ.
#3023
,
|
|
|
|
Цитата MyNameIsIgor @ Во-первых, ты нарушаешь ODR. Уверен? Цитата Да, гарантирует и я не добавляю, а изменяю. Поэтому, даже если и слинкуется, то trainer уже объяснил: во-вторых, гарантируется порядок следования полей только для одной секции (privete/protected/public). Если ты меняешь их объявления, то компилятор вправе расположить поля иначе - нарушения бинарной совместимости - неопределённое поведение. |
|
Сообщ.
#3024
,
|
|
|
|
Цитата D_KEY @ Это был пример на твоёТы можешь изменить .h и добавить тут public. |
|
Сообщ.
#3025
,
|
|
|
|
Цитата D_KEY @ Уверен? Лол? Цитата D_KEY @ Да, гарантирует и я не добавляю, а изменяю. А я где сказал "добавляешь"? Именно, ты меняешь - это другой тип - компилятор располагает поля как хочет. Добавлено И, да, я специально не упоминаю pimpl, ибо тогда вообще всё будет крайне уныло |
|
Сообщ.
#3026
,
|
|
|
|
Цитата MyNameIsIgor @ Цитата D_KEY @ Уверен? Лол? Нет. Просто не вижу, где бы тут было нарушение ODR с точки зрения формального определения. Хотя, скорее всего, ты прав, а мне должно быть стыдно Цитата Цитата D_KEY @ Да, гарантирует и я не добавляю, а изменяю. А я где сказал "добавляешь"? Именно, ты меняешь - это другой тип - компилятор располагает поля как хочет. Секция по прежнему одна, значит порядок по прежнему гарантируется. Добавлено Цитата MyNameIsIgor @ И, да, я специально не упоминаю pimpl, ибо тогда вообще всё будет крайне уныло ![]() Конечно. Собственно речь шла о том, что если захочешь, то сделаешь(пусть и не по стандарту, а для конкретного компилятора). Язык не может защитить от глупости или преднамеренных хаков. |
|
Сообщ.
#3027
,
|
|
|
|
Цитата MyNameIsIgor @ korvin, вы тоже нарушаете ODR, это тоже неопределённое поведение - разговор закончен. т.е. никакой гаранттии инкапсуляции классы не дают? замечательно... |
|
Сообщ.
#3028
,
|
|
|
|
Цитата D_KEY @ Ты гарантируешь, что в любом классе она одна? А ничего, что у тебя видимо появились две public ? Секция по прежнему одна, значит порядок по прежнему гарантируется. |
|
Сообщ.
#3029
,
|
|
|
|
Цитата korvin @ Цитата MyNameIsIgor @ korvin, вы тоже нарушаете ODR, это тоже неопределённое поведение - разговор закончен. т.е. никакой гаранттии инкапсуляции классы не дают? замечательно... А они должны давать гарантии? Спецификаторы доступа нужны только для описания и контроля за случайными ошибками программистов. |
|
Сообщ.
#3030
,
|
|
|
|
Цитата D_KEY @ Нет. Просто не вижу, где бы тут было нарушение ODR с точки зрения формального определения. Хотя, скорее всего, ты прав, а мне должно быть стыдно Прекрати. Obj скомпилирован с одним ашником, а твой cpp - с другим (даже если ты "изменил" его с поммощью препроцессора). В результате у тебя линкуется два объектника, которые скомпилированы с двумя разными типами с однинаковым названием. Это не нарушение ODR? Цитата D_KEY @ Секция по прежнему одна, значит порядок по прежнему гарантируется. Порядок секций не гарантируется! Только порядок полей внутри секций. Если ты меняешь private на public, то компилятор вправе переставить секции местами, если ему так удобнее. |