Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/48: Рейтинг темы: голосов - 48, средняя оценка - 4.81
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826

Инициализация статического поля

29.03.2016, 16:44. Показов 10544. Ответов 72
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день,

как объяснить необходимость объявить все статические поля, даже те у которых есть конструктор по умолчанию, вне класса до main. Почему код ниже компилятор не может сам всё порешать в 2016-ом году?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
 
struct Foo
{
   static int x;
};
int Foo::x;
 
int main()
{
   Foo::x;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.03.2016, 16:44
Ответы с готовыми решениями:

Инициализация статического массива
Добрый вечер! Допустим, что имеется класс class A { .... public: static int array; .... }; Как инициализировать массив в...

Инициализация статического массива
Ребята, помогите пожалуйста. Не получается проинициализировать NULL-ами статиеский массив указателей. Пишет слудеющее (прикрепил скриншот)....

Инициализация в классе статического объекта класса :)
Добрый день! Огромное спасибо за ваше внимание! Помогите разобраться с такой проблемой. Есть чисто статический класс (не нужен его объект...

72
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
30.03.2016, 02:08
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от hoggy Посмотреть сообщение
в настоящий момент оби эти технические задачи решены.
Мне надоело рассказывать сказку про белого бычка, поэтому я повторю в десятый и последний раз: частичная упорядоченность инициализации статических объектов - это фича языка С++, предоставляемая языком программисту.

"Решить" эту задачу можно только один способом: забрать у программиста эту фичу и заявить, что в языке больше не существует вообще никакой упорядоченности инициализации статических объектов. Т.е. поступить по принципу "лучшим лекарством от перхоти является гильотина" - это именно то, что означает ваше "оби эти технические задачи решены".

Комитет по стандартизации принял решение уничтожить эту фичу языка? Нет. Комитет по стандартизации хотя бы объявил ее deprecated? Нет. Значит, зайчик вы наш, ваши разглагольствования о каком-то "решении задачи" в данном случае - продукт вашего воображения.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.03.2016, 02:14
Цитата Сообщение от IGPIGP Посмотреть сообщение
Если сразу за точкой с запятой класса определить, то это может вызвать аллергию?
так ведь не просто за точкой с запятой, а ещё и в спп файле.
за точкой с запятой - это только шаблоны позволяют.

господин rikimaru2013 вообще не хочет писать
определение статического члена.

он хочет, что бы член инициализировался дефолтным значением.
и что бы компилятор как нибудь сам это все разрулил.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
30.03.2016, 02:23
Цитата Сообщение от hoggy Посмотреть сообщение
это такая же выдуманная мною сущность,
как и ваши "псевдодеструкторы", или "синтаксические уровни".
Да что вы говорите? Цитата из стандарта языка

5.2.4 Pseudo destructor call
1 The use of a pseudo-destructor-name after a dot . or arrow -> operator represents the destructor for the
non-class type denoted by type-name or decltype-specifier.[...]
Цитата Сообщение от hoggy Посмотреть сообщение
вот это ваше "выражение T()" - назовите мне хотя бы одну причину,
по которой я не могу воспринимать его как вызов конструктора для некого T?
Во-первых, вы уже сами вляпались собственной физиономией в эту причину Если бы у типа int был дефолтный конструктор, то он бы вызывался и для локальных объектов. А он что-то не вызывается... Ваши потешные супер-теории про какие-то волшебные два дефолтных конструктора (!) я даже рассматривать не буду.

И, во-вторых, да, вы лично можете воспринимать это как угодно. Но не удивляйтесь, если ваши попытки втирать ваши теории тут будут восприниматься с удивленным недоумением (мягко выражаясь)

Цитата Сообщение от hoggy Посмотреть сообщение
вот сейчас это уже похоже на откровенный бред.

фундаментальные типа не являются полноценными оо-типами,
потому что не поддерживают ряд присущих ему свойств.
от инта нельзя отнаследоваться, например.

я писал о полноценных оо-типах.
они не являются классами.
цитатку поищите сами.

а вот это уже троллинг.
Пошел поток сознания. Я думаю, что тут уже все понятно.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.03.2016, 02:29
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
частичная упорядоченность инициализации статических объектов - это фича языка С++, предоставляемая языком программисту.
одно другому не мешает.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
"Решить" эту задачу можно только один способом: забрать у программиста эту фичу и заявить, что в языке больше не существует вообще никакой упорядоченности инициализации статических объектов. Т.е. поступить по принципу "лучшим лекарством от перхоти является гильотина" - это именно то, что означает ваше "оби эти технические задачи решены".
бред.
я даже не хочу думать о том,
на основании чего вы делаете такие выводы.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Комитет по стандартизации
собственные планы не осиливает.
см #7

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
зайчик вы наш, ваши разглагольствования о каком-то "решении задачи" в данном случае - продукт вашего воображения.
котенок, hoggy, в переводе означает "ёжик".
тот факт, что в компиляторах уже сегодня реализовано все необходимое,
что бы впилить возможность определять статики в хэдерах/классах - это не воображение.

конечно, может быть вы не в состоянии глядя на примеры с шаблонами,
сделать вывод, что проблему ODR успешно удалось преодолеть ещё хз в каких годах.

может быть у вас в голове не укладывается мысль,
что для того, что бы позволить определять статические поля прямо в классе,
вовсе не нужно изменять порядок инициализации статических переменных
ед. трансляции.

но тут уж я вам ничем не могу помочь.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
30.03.2016, 02:34
Цитата Сообщение от hoggy Посмотреть сообщение
собственные планы не осиливает.
Ох, расскажите мне о комитете по стандартизации И уже не позорьтесь, выдавая ваши личные домыслы за планы комитета по стандартизации - я все таки про эти планы знаю неизмеримо больше вашего

Не по теме:


Цитата Сообщение от hoggy Посмотреть сообщение
котенок, hoggy, в переводе означает "ёжик".
Hedgehoggy (от hedgehog) в переводе означает "ежик". Hoggy (от hog) в переводе означает "свинка".

0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
30.03.2016, 02:39
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Почему код ниже компилятор не может сам всё порешать в 2016-ом году?
Потому что он не знает без вашего явного указания в каком именно модуле должна быть отведена память в сегменте данных под этот static. Причем в 2016 не знает точно так же как и в 1986.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.03.2016, 02:49
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Да что вы говорите?
вообще то, я имел ввиду,
что "фиктивный конструктор" и "псевдоконструктор" - это синонимы.

только у вас похоже мазгов не хватает понять.
может быть вам слово "фиктивный" не знакомо?

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Если бы у типа int был дефолтный конструктор, то он бы вызывался и для локальных объектов. А он что-то не вызывается...
вы ещё и не внимательный.
для вас же специально старался печатал пример:
C++
1
2
3
4
int a; //<--- дефолтный ничего не делающий конструктор
* * * *// мусор
int b = int(); // <--- дефолтный конструктор
* * * *// инициализация нулём
он ничего не делающий.

кстати, найдите ка мне цитатку, где говорится,
что все классы обязаны иметь конструктор.
что если программист его не опишет,
тогда он будет сгенерирован автоматически компиляторов.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Foo
{
   int x,y,z;
};
 
 
int main()
{
   Foo f; //<--- ничего не делающий конструктор
      //класса
    
   // мусор
   std::cout << f.x<<std::endl;
}
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
не удивляйтесь, если ваши попытки втирать ваши теории тут будут восприниматься с удивленным недоумением
не переживайте.
в основном меня окружают адекватные люди.
лишь изредка проскакивают исключения.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Пошел поток сознания. Я думаю, что тут уже все понятно.
у меня осталась к вам парочка вопросов.

1.
стандарт языка не описывает, что такое ооп.
вы знаете, что такое ооп?

2.
вам понятен смысл слова "оо-тип" ?

это - тест на вашу адекватность.

Добавлено через 3 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ох, расскажите мне о комитете по стандартизации И уже не позорьтесь, выдавая ваши личные домыслы за планы комитета по стандартизации - я все таки про эти планы знаю неизмеримо больше вашего
предлагаю вам меряццо своей пиписькой вот здесь:
Почему С++ отстой до 2020 года

Добавлено через 27 секунд
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Потому что он не знает без вашего явного указания в каком именно модуле должна быть отведена память в сегменте данных под этот static.
вы знаете, что такое "шаблоны с++" ?
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
30.03.2016, 02:53
Цитата Сообщение от hoggy Посмотреть сообщение
вы знаете, что такое "шаблоны с++" ?
Знаю
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
30.03.2016, 03:01
Цитата Сообщение от hoggy Посмотреть сообщение
вообще то, я имел ввиду,
что "фиктивный конструктор" и "псевдоконструктор" - это синонимы.
Осспади... И что из этого?

В терминологии языка С++ есть термин "вызов псевдодеструктора", но нет и никогда не было термина "псевдоконструктор". Поэтому к чему вы нам тут рассказываете свои сокровенные мысли о каких-то "синонимах" и "псевдоконструкторах" мне в упор не ясно.

Неужели так трудно было поверить, вместо того, чтобы вот так подставляться?

Значит, еще раз, слушай мою команду: ваше бессвязное барахтанье в ваших же собственных выдумках себя полностью исчерпало и начинает ходить по кругу с нарастанием степени бессвязности. Я уже начинаю вас жалеть. Мой вам совет: учите матчасть, причем начинайте с азов. Пока что вы нам лишь вещаете теории из разряда диссертации Василия Ивановича: "Записывай, Петька, безногий таракан - не слышит".
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
30.03.2016, 11:59  [ТС]
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
в каком именно модуле должна быть отведена память в сегменте данных под этот static
причём тут модуль? Запуск программы подразумеваем некую область памяти под такого рода объекты, а с какой static lib или dynamic lib она, я думаю тут не причём. Тем более если вы говорите про обычные единицы трансляции.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
30.03.2016, 16:18
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
причём тут модуль? Запуск программы подразумеваем некую область памяти под такого рода объекты
Эта область памяти называется сегмент данных. И сшивается он из сегментов данных каждого obj. т.е. декларация к примеру int a; означает отвести в сегменте данных 4 байта и сопоставить с ними (добавить в словарь разбора) имя a. Причем отводятся они в сегменте данных текущего obj. при линковке это все собирается в один сегмент данных exe. декларация же static в классе соответствует декларации extern int a; которая означает добавить в словарь разбора имя, а где находятся сами данные соответствующие этому имени проблема линкера. Так вот если они не в каком модуле не выделены а только задекларированы линкер их нигде и не найдет.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.03.2016, 18:47
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В терминологии языка С++ есть термин "вызов псевдодеструктора", но нет и никогда не было термина "псевдоконструктор". Поэтому к чему вы нам тут рассказываете свои сокровенные мысли о каких-то "синонимах" и "псевдоконструкторах" мне в упор не ясно.
C++
1
2
int a = int(); //<--- переменная проиницилизированна 
    // при помощи дефолтного конструктора
фиктивный - значит "не настоящий".
это - всего лишь сахарок,
благодаря которому создается весьма убедительная имитация,
будто бы у примитивов действительно
есть все эти конструкторы-диструкторы.

весь этот сахарок описывается в стандарте.
может быть другими словами,
но смысл абсолютно одинаковый.

вы же вообще не в состоянии что либо понять,
если только это - не цитата из стандарта.

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

любой адекватный человек воспримет правильно.
вы же опять начнете ныть,
что вот в стандарте таких фраз нет,
а значит это все - не более, чем выдумки.

при этом вы проигнорируете выдержку кода,
которая иллюстрирует положение на практике.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
в ваших же собственных выдумках
свои "выдумки" я могу потвердить кодом.
и ни одна из этих "выдумок" не противоречит положениям стандарта языка.

вот только вы все равно своими мозгами понять это не в состоянии.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Мой вам совет: учите матчасть, причем начинайте с азов.
мне не интересны дешовые понты.

мне интересны знания, которые я смогу применять на практике.
но вряд вы сможете сообщить мне что нибудь о с++ такое,
чего бы я ещё не знал.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
30.03.2016, 18:54
Цитата Сообщение от hoggy Посмотреть сообщение
но вряд вы сможете сообщить мне что нибудь о с++
Это точно! Как об стенку горох!
0
30.03.2016, 18:57

Не по теме:

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
я все таки про эти планы знаю неизмеримо больше вашего
Герб, перелогинтесь :)

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.03.2016, 18:58
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Знаю
тогда вы в курсе,
что шаблоно код целиком и полностью живет в хедерах.
а так же, знаете, что у шаблоно-классов
бывают статические члены.
которые определяются прямо в хедерах.

выше вы писали:
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Потому что он не знает без вашего явного указания в каком именно модуле должна быть отведена память в сегменте данных под этот static. Причем в 2016 не знает точно так же как и в 1986.
однако, в случае с шаблонами,
компилятор прекрасно все разруливает
и без участия человека.

получается, что вы ошибаетесь.
и компиляторы прекрасно умеют
самостоятельно разруливать подобные вопросы.

другое дело, что технология реализована только для шаблонов.
на обычные классы тупо забили болт.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
30.03.2016, 19:19
Цитата Сообщение от hoggy Посмотреть сообщение
однако, в случае с шаблонами,
компилятор прекрасно все разруливает
и без участия человека.
Да ниче он не разруливает без человека. Точно так же объявляется за классом только в хидере. Не дай бог они два раза раздельно включатся эти хидеры, линкер матом обложит. Единственная решение - линкеру не находить коллизии имен в словарях а объединять повторяющиеся имена при совпадении сигнатуры. Что очень чревато.
Цитата Сообщение от hoggy Посмотреть сообщение
другое дело, что технология реализована только для шаблонов.
Надеюсь понимаете что технология extern templates она не из за того что для просто классов что то не реализовано, а из за того что для шаблонов кое что реализовано криво.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.03.2016, 19:33
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Не дай бог они два раза раздельно включатся эти хидеры, линкер матом обложит.
не уловил. что значит "раздельно включатся эти хидеры" ?

потому что один и тот же хэдер со всеми своими шаблонами
включается во множество спп файлов.
и никаких проблем.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
30.03.2016, 19:38
Цитата Сообщение от hoggy Посмотреть сообщение
и никаких проблем.
То так кажется.
Цитата Сообщение от hoggy Посмотреть сообщение
потому что один и тот же хэдер со всеми своими шаблонами
включается во множество спп файлов.
Либо инстанционируется свой не экстерн статик при инстанционировании каждого типа в шаблона в каждом модуле, (т.е. статики только в передлах модуля в которых они инстанционированы статики). Либо линкер вместо поиска коллизий имен занимается для шаблонов черти чем. При этом как одно так и другое криво.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.03.2016, 19:44
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
То так кажется.
мне ничего не кажется.
шаблоны имеют иммунитет против нарушений ODR.

вы можете совершенно безопасно их использовать.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Либо инстанционируется свой не экстерн статик при инстанционировании каждого типа в шаблона в каждом модуле, (т.е. статики в передлах модуля статики). Либо линкер вместо поиска коллизий имен занимается для шаблонов черти чем. При этом как одно так и другое криво.
реализация на усмотрении разработчиков компилятора.
компилятор cl (вижуал студия) для каждой ед. трансляции
инстанцирует собственную копию.
потом линкер повыкидывает все,
кроме одной.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Потому что он не знает без вашего явного указания в каком именно модуле должна быть отведена память в сегменте данных под этот static.
и как то внезапно оказывается,
что все он прекрасно знает.

без всяких явных указаний разберется,
какой модуль выбрать.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
30.03.2016, 19:59
Цитата Сообщение от hoggy Посмотреть сообщение
и как то внезапно оказывается,
что все он прекрасно знает.
Да в том то и дело что ничего он не знает. Поэтому для того чтобы шаблоны слинковать либо начинает фантазировать либо статик этот не совсем статик.
Цитата Сообщение от hoggy Посмотреть сообщение
потом линкер повыкидывает все,
кроме одной.
Вот это и есть криво. Линкер должен не копии объединять а искать коллизии имен. Если это "повыкидывает" не только на шаблоны распространить а на все extern будет одна большая каша. поэтому и стараются шаблоны к общей схеме привести через extern templates но никак не наоборот.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.03.2016, 19:59

Инициализация статического члена из шаблонного класса
Добрый день. Есть код: template&lt;int test&gt; class Test { template&lt;int a&gt; struct Inner { static bool...

Инициализация константного статического объекта - члена класса
Здравствуйте, у меня возникла проблема с инициализацией статического объекта, который является членом класса. Этот объект должен быть...

Инициализация статического члена std::vector в шаблонном классе
есть класс myclass , владеющий классом struct template&lt;class T&gt; class myclass { struct mystruct {}; public: static...

Заполнение статического поля класса с клавиатуры
Доброго времени суток, возникла проблема. Я не могу задать статическое поле с клавиатуры. Задача: добавить статическое поле и 2 метода...

Static поля в классе и инициализация
Мне нужен класс, у которого было бы общие переменные и функции их устанавливающие \ читающие для всех экземпляров. Но статик поля требует...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Знаете, от чего появляется стресс?
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
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru