|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||||
Инициализация статического поля29.03.2016, 16:44. Показов 10548. Ответов 72
Метки нет (Все метки)
Добрый день,
как объяснить необходимость объявить все статические поля, даже те у которых есть конструктор по умолчанию, вне класса до main. Почему код ниже компилятор не может сам всё порешать в 2016-ом году?
0
|
||||||
| 29.03.2016, 16:44 | |
|
Ответы с готовыми решениями:
72
Инициализация статического массива
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 30.03.2016, 00:21 | |||||||
|
порядок инициализации ед. трансляций не определен. программист не знает, в какой момент будет выполняться нетривиальная инициализация его объекта. порядок вычисления аргументов функций не определен. программист не знает, в каком порядке будут вычисляться аргументы в этой ситуации программисту нет смысла думать о каких то там моментах инициализации, или о порядке вычисления аргументов функции. но из этого никак не следует, что: в каком именно порядке будут вычислены конкретные аргументы конкретной функции. и программист ему для этого не нужен. следуя этой аналогии дальше, приходим к противоречию с: подумайте о том, что вы пытаетесь сейчас
0
|
|||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
|
|
| 30.03.2016, 00:24 | |
|
1
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||
| 30.03.2016, 00:29 | ||||||||||
0
|
||||||||||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||
| 30.03.2016, 00:34 [ТС] | ||
|
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 30.03.2016, 00:38 | |||||||
|
и даже не один. одних только дефолтных конструкторов - две штуки, с двумя разными поведениями. то, что они на самом деле фиктивные - не принципиальный момент. принципиально, что они являются полноправными оо-типами языка. и отвечают общим требованиям: иметь конструкторы, деструкторы, и тп. и если бы это было не так, тогда программирование на шаблонах превратилось бы в Адь и Израиль. http://rextester.com/PDK55092
1
|
|||||||
|
Комп_Оратор)
|
|||||||
| 30.03.2016, 00:39 | |||||||
1
|
|||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
|
||||||||
| 30.03.2016, 00:49 | ||||||||
|
Все, что я сказал выше - не бином Ньютона. Все предельно просто и понятно, и никак не опровергается неопределенностью глобального порядка инициализации. Поэтому зачем вы нам просто снова и снова дылдоните про неопределенность глобального порядка - мне не ясно. Меня ваш глобальный порядок (точнее, его отсутствие) совершенно не расстраивает. Более того, уясните простую вещь: если оторваться от требований стандартной С++ машины, то ни в языке С, ни в языке С++ вообще нет никакого порядка, кроме порядка возникновения наблюдаемого поведения (observable behavior), которое сводится к выполнению операций ввода-вывода и доступу к volatile объектам. Все остальное - лишь частично упорядочивающие абстракции, определяющие общую семантику операций, а не порядок их выполнения. И в ряду таких частично упорядочивающих абстракций порядок инициализации статических объектов никак не выделяется ни в худшую, ни в лучшую сторону. Как не выделяется и порядок вычисления аргументов функции или подвыражений в выражении. Добавлено через 4 минуты Конструкторы в С++ могу быть только у класс-типов. Никаких конструкторов у скалярных типов нет и никогда не было. Программирование шаблонов в этой области унифицировано на чисто синтаксическом уровне: на уровне общего синтаксиса инициализации (и общего синтаксиса вызова псевдодеструктора). Никаких "фиктивных конструкторов" тут нет и выдумывать их на ровном месте не надо. Это никому не нужно.
0
|
||||||||
|
Комп_Оратор)
|
||
| 30.03.2016, 00:50 | ||
|
Что касается шаблонов, то они описывают не объект, а совокупность классов, каждый из которых может описывать объект. То есть, инстанс они описывают. Сравнение шаблона с классом, в этом смысле, мне не кажется корректным.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||
| 30.03.2016, 01:00 | |||||
|
феникс, локальные статики, расширения компиляторов, которые позволяют задать порядок, все это как бе не без причины имеет место быть. участия человека не сможет порешать вопрос. мол, человек определяет момент инициализации. мой посыл - на примере шаблонов мы видим: компиляторы уже давно научились решать такие вопросы. и человеки им для этого не нужны. человеки и дальше могут определять порядок в рамках одной ед. трансляции. это никак не мешает позволить определять статическое поле в хедерах. тема не о порядке инициализации.
0
|
|||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
|
||
| 30.03.2016, 01:03 | ||
|
"Господин IGPIGP" открыто сказал, что инициализация нестатических полей класса описывается конструктором их класса-хозяина. Вы заявили, что то же самое справедливо и для статических полей класса, вызвав тем самым всеобщее недоумение. После чего вы привели какой-то пример кода, который вообще никаким боком к этому вопросу не относится. К чему это?
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||
| 30.03.2016, 01:16 | |||||||||||
|
что не настоящих конструкторов у примитивом нет? обычно на этом этапе мне начинают показывать ассма-выхлопы, доказывая, что никаких вызовов "специальных функций" не происходит. вот здесь я наблюдаю два разных поведения:
из-за практических соображений. вам не очевидно для чего был создан этот сахарок? не очевидно, для чего была создана настолько правдоподобная имитация полноценного оо-типа для фундаментальных? я сказал - примитивы имеют фиктивные конструкторы, которые вполне себе можно воспринимать как обычные. для того их и создавали. о да, шандец просто противоречие.
0
|
|||||||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
|
||
| 30.03.2016, 01:16 | ||
sizeof мы видим, что строковые функции стандартной библиотеки уже давно научились вычислять размер объекта без попутного форматирования жесткого диска".Это замечательно. Но мне совершенно не интересно, что там компиляторы научились делать в шаблонах, как мне совершенно не интересно, что там компиляторы научились делать в sizeof.В шаблонах компиляторы научились лишь бороться с множественным выделением памяти для одного и того же объекта (или функции). Я же ясно и четко сказал в самом начале: требование явного объявления статического объекта не имеет ни какого отношения к борьбе с множественным выделением памяти. Поэтому зачем вы нам постоянно дылдоните про то, что "компиляторы научились" - мне не ясно. Это не имеете никакого отношения к рассматриваемому вопросу. Речь же идет о том, что порядок инициализации статических объектов частично упорядочен и это частичный порядок подчинен мне и моему замыслу. И ни о каком "компиляторы научились" речи быть не может, ибо моего замысла компилятор не знает и знать не может. (Это даже не говоря о том, что при желании я могу до той же степени также упорядочить и шаблонную инициализацию через явную инстанциацию.)
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 30.03.2016, 01:21 | |||
|
но сейчас недоумение у меня вызываете вы. инициализация любого экземпляра описывается конструктором его класса.
0
|
|||
|
Комп_Оратор)
|
||
| 30.03.2016, 01:30 | ||
|
То есть я не понимаю фразы о том "ну так и статик точно так же определяется конструктором" и об этом говорю.
0
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
|
|||||||||||
| 30.03.2016, 01:34 | |||||||||||
int. А когда вас реальная жизнь ляпнула физиономией прямо в пример, который противоречит вашим доморощенной теории, вы, вместо того, чтобы взять спецификацию языка и разобраться, начали выдумывать еще дополнительные химеры наж уже существующими химерами - теперь у вас в голове родились "два дефолтных конструктора".В спецификации же языка просто сказано, что локальный скалярный объект без инициализатора содержит неопределенное значение. И в спецификации же языка просто сказано, что выражение T() порождает value-initialized значение типа T, value-initialization для int сводится к инициализации нулем.Нигде никак не упоминается никаких конструкторов. А вот "правдоподобная имитация полноценного оо-типа" существует только в вашем воображении. Вы с чего-то принялись расценивать обычный С++ синтаксис, как какой-то "ОО". Никакого отношения ни к какому "ОО" ничего из этого не имеет. Вопрос, конечно, риторический. Все это не более чем выстроенные вами в вашей же голове домыслы. Как я уже говорил выше, эти ваши построения имели бы право на существование, если бы обладали какой-то объяснительной или обучающей ценностью. Примеры таких выдуманных сущностей есть: двухфазный поиск имен в шаблонах (two-phаse lookup) - в стандарте отсутствует как самостоятельная концепция, но полезна, как понятный альтернативный способ описания поиска. Таблицы виртуальных методов - то же самое. Принцип SFINAE - то же самое. Понятие "универсальной ссылки" (universal reference) Мейерса - тоже. Но ваши самодельные теории, увы, таковой ценностью не обладают. Стандартная система концепций инициализации и проще, и понятнее. И не требует надстраивания химер над химерами.
0
|
|||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||||||
| 30.03.2016, 01:39 | ||||||||||||||||||||
|
вы сейчас троллите, или тупите? раз до сих пор не понятно, тогда я поясню. для того, что бы можно было определять статические поля прямо в декларации класса, нужно решить две инженерные задачи: 1. прежде всего необходимо решить проблему множественного определения. 2. определить момент инициализации такого члена в рамках одной единицы трансляции. в настоящий момент оби эти технические задачи решены. порядок в рамках 1 ед. трансляции как и прежде - в порядке объявления. множеств пример возможного дизайна:
как это сделано для шаблонов. резюмируя: в настоящий момент нет никаких технических ограничений. это просто тупо не реализовано и все. Добавлено через 5 минут но проблем создать его нет никаких. ни у обычных классов, ни у шаблонных. но создается он точно так же как и любой другой объект при помощи своего конструктора. значением, которое указал программист. представьте себе, что это будет происходить прямо в декларации класса: было так:
изменилось только место, в котором описывается, чем нужно проинициализировать объект.
0
|
||||||||||||||||||||
|
Комп_Оратор)
|
||
| 30.03.2016, 01:52 | ||
|
Фактически, разговор сводится к тому, чтобы сократить возможности ради внешних признаков. Так мне кажется.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||
| 30.03.2016, 01:59 | ||||||||||
|
как и ваши "псевдодеструкторы", или "синтаксические уровни". это - практика. вот это ваше "выражение T()" - назовите мне хотя бы одну причину, по которой я не могу воспринимать его как вызов конструктора для некого T? пока вы не ответите на вопрос: зачем был нужен этот сахарок, вы так и будете заниматься беспонтовым буквоедством. зачем это было сделано. потому что не поддерживают ряд присущих ему свойств. от инта нельзя отнаследоваться, например. они не являются классами. цитатку поищите сами. Добавлено через 3 минуты хотите - определяйте как раньше в спп. хотите - определяйте в хедере а хотите - определяйте прямо в классе.
0
|
||||||||||
|
Комп_Оратор)
|
||
| 30.03.2016, 02:06 | ||
|
Если сразу за точкой с запятой класса определить, то это может вызвать аллергию? Как по мне, то разговор как-то облегчился.
0
|
||
| 30.03.2016, 02:06 | |
|
Инициализация статического члена из шаблонного класса Инициализация константного статического объекта - члена класса Инициализация статического члена std::vector в шаблонном классе Заполнение статического поля класса с клавиатуры Static поля в классе и инициализация Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2.
Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
|
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её.
Всё это стресс конечно. Почему?. . .
|
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот.
Ларри Уингет
|
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
|
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|