9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
|
||||||
1 | ||||||
Инициализация статического массива08.05.2011, 23:37. Показов 16963. Ответов 45
Метки нет (Все метки)
Добрый вечер!
Допустим, что имеется класс
0
|
08.05.2011, 23:37 | |
Ответы с готовыми решениями:
45
Инициализация статического массива Инициализация статического поля Инициализация статического члена из шаблонного класса Инициализация константного статического объекта - члена класса |
13.05.2011, 19:46 | 41 |
Вообще НЕ статические const поля класса можно инициализировать только в конструкторе. Причём не в теле конструктора, а через двоеточие. Как это делать для массивов - я не знаю. И как-то не разу не видел таких конструкций. Может их вообще и нет, хотя по логике они ничему не противоречат. Через гугл во всяком случае ничего интересного не нашёл: все предлагают миллион способов как это сделать через ж...у, но нигде не увидел явно сказанных слов про то, что по честному в Си++ это сделать нельзя
Если тебе массив нужно проинициализировать константным значением, то такая конструкция, ко всему прочему, лишена смысла - зачем в каждом экземпляре класса плодить одинаково инициализированные поля, если можно использовать статическое поле
1
|
alexsvk
|
13.05.2011, 20:17
[ТС]
#42
|
Не по теме: Информационная тема вышла..:)
0
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
||||||
13.05.2011, 20:23 | 43 | |||||
Это еще не все...
Как это ни странно, но большие проблемы возникают при попытках объявить в классе константный массив встроенного типа! Как мы уже выяснили, константы нельзя инициализировать в теле конструктора, значения им присваиваются только в списке инициализации конструктора. Однако для константного массива встроенного типа не работает даже инициализация нулем. ПРИМЕЧАНИЕ Этот вопрос практически не отражен в стандарте, поэтому компиляторы ведут себя по-разному. В системе Visual C++.NET 2003 выдается ошибка компиляции C2439, а Borland C++ Builder 6 выдает только предупреждение W8038 о том, что массив не инициализируется. Не проходит и отмена константности. Например, зададим массив m0 как константный, а в теле конструктора определим инициализацию в цикле:
Удивительно, но для константного массива из объектов не встроенного типа задавать инициализацию нулем разрешается. Для этого в классе должен быть определен конструктор без аргументов, который вызывается для инициализации каждого элемента константного поля-массива.
0
|
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
|
|
13.05.2011, 20:35 [ТС] | 44 |
То есть, если я определю свой тип, IntType, к примеру; где будет поле int, то инициализация с удалением константности пройдёт?
Дело в том, что я этот способ предлагал выше в теме, но Evg констатировал тот факт, что это нереализуемо на нижнем уровне.
0
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
13.05.2011, 23:15 | 45 |
Например, вполне можно инициализировать константный массив денег, объявленный в качестве поля:
const TMoney ss[10]; Для этого достаточно задать в списке инициализации конструктора инициализацию нулем ss(). Как реально инициализируется такой массив, конечно, зависит от реализации конструктора без аргументов, который вызывается в этом случае.
0
|
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
|
|
13.05.2011, 23:19 [ТС] | 46 |
ValeryLaptev, проще и изысканней добавить модификатор static.
C const инициализация массива идёт через з.....цу
0
|
13.05.2011, 23:19 | |
13.05.2011, 23:19 | |
Помогаю со студенческими работами здесь
46
Инициализация статического члена std::vector в шаблонном классе Размер статического массива Обнуление статического массива Из статического массива в динамический Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |