Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/47: Рейтинг темы: голосов - 47, средняя оценка - 4.70
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359

Ошибка "Constant expression is required" - const в сlass

13.12.2011, 17:07. Показов 10029. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создал класс:
C++
1
2
3
4
5
6
7
8
 class TVseGrup
{
public:
    TVseGrup(const  short KolTo4=0) :
    FKolTo4(KolTo4) {FKolTo4=0;}
    const short FKolTo4;
    int MassivTo4Grup[FKolTo4]; //вот тут ругается.
};
Вроде бы объявил переменную const. Чего ему еще надо, не пойму?!!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.12.2011, 17:07
Ответы с готовыми решениями:

Ошибка Constant expression required. Как исправить?
Здравствуйте, разбирал этот пример. Вроде по скринам должен работать, но выскакивает ошибка Constant expression required в строках ...

Ошибка в коде E2313 Constant expression required
Доброго времени суток, при компиляции пишет ошибку "E2313 Constant expression required", не могу разобрать как исправить, я так понял что...

E2313 Constant expression required
при компиляции возникает ошибка в последней строке test.v1.cpp(38): E2313 Constant expression required main (){ int count; int j...

13
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
13.12.2011, 17:24
Цитата Сообщение от Андрей2011 Посмотреть сообщение
FKolTo4=0
Константа на то и константа, что ее менять нельзя.
0
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
13.12.2011, 17:29  [ТС]
да не. там в другом фигня. Впрочем, когда я объявил маасив вот так: MassivTo4Grup[] - проблема отпала. Но вот дальше у меня вот что:

C++
1
2
3
4
TVseGrup VseGrup(13);
 
const short KolTo4 = VseGrup.FKolTo4;
int Mass[KolTo4]; //тут ругается на такую же ошибку. хотя константа же((((
т.е. выходит что из класса я получил константу. Но эта константа отказывается в массив загружаться. Как же быть?
0
ниначмуроФ
 Аватар для PointsEqual
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
13.12.2011, 18:34
Андрей2011, используй вектор и все
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
13.12.2011, 18:38
Цитата Сообщение от Андрей2011 Посмотреть сообщение
т.е. выходит что из класса я получил константу. Но эта константа отказывается в массив загружаться. Как же быть?
Это константа не compile-time, а как в Си - тупо read-only.
0
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
13.12.2011, 18:46  [ТС]
Вектор? не работал с ними. это тож типа массива?
"me, а как в Си - тупо read-only." - от этого не легче.
Я вышел из положения просто добавив массив в тот вот класс, где вызывал констатну на массив. И в классе у массива не опредлелил кол-во элементов. т.е. поставил [].
Чем мне может это грозить и на сколько этот выход правильный?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
13.12.2011, 18:53
Цитата Сообщение от Андрей2011 Посмотреть сообщение
Вектор? не работал с ними. это тож типа массива?
Это класс предоставляющий безопасную работу с динамической памятью.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <vector>
 
class TVseGrup
{
public:
   TVseGrup(const short KolTo4 = 0) {
      MassivTo4Grup.resize(KolTo4);
   }
 
   std::vector<int> MassivTo4Grup;
};
Дальше работаем, как с самым обыкновенным массивом.

Цитата Сообщение от Андрей2011 Посмотреть сообщение
Я вышел из положения просто добавив массив в тот вот класс, где вызывал констатну на массив. И в классе у массива не опредлелил кол-во элементов. т.е. поставил [].
Чем мне может это грозить и на сколько этот выход правильный?
Вы не могли бы полностью код показать? А то я не совсем понимаю что именно Вы сделали
0
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
14.12.2011, 10:35  [ТС]
Здорво. Вектор оказывается удобная штука. Но точно ли ывделяется динамическая память? там же нет new!

Вот мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 class TTo4ka
{
public:
 
//****
 
};
 
 
 class TConstPole
{
public:
    TConstPole(const short Sirina=5,const short Dlina=5) :
    FSirina(Sirina), FDlina(Dlina)
   ,FKolTo4((Sirina <<1) * (Dlina <<1))
  {}
 
    const short FSirina;
    const short FDlina;
    const short FKolTo4;
    TTo4ka To4ka[]; //вот тут класс точка но без ограничения длины.
          //вообще я сначала хотел ограничивать длину массива через константу переданную в
         //виде const, но выкрутился вот таким способом.
         //а т.к. я раньше подобного не делал то не знаю на сколько мой код вообще правильный
        //и сем может грозить мне создание массива без ограничения длинны.
};
Спасибо за помощь!
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
14.12.2011, 13:02
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Андрей2011 Посмотреть сообщение
Но точно ли ывделяется динамическая память? там же нет new!
А Вы внутри классов vector и allocator уже посмотрели?

Цитата Сообщение от Андрей2011 Посмотреть сообщение
а т.к. я раньше подобного не делал то не знаю на сколько мой код вообще правильный и чем может грозить мне создание массива без ограничения длинны.
Честно говоря, я точно не знаю, что происходит здесь
Но предполагаю, что массив создается, как бы сказать, нулевой длины. То есть sizeof вернет 0. Следовательно писать и читать из этого массива нельзя вообще. В любом случае будет выход за границы массива. Фактически при обращении к такому массиву происходит преобразование в указатель, а потом уже с этим указателем можно делать что угодно.

Не знаю зачем компилятор позволяет такое делать. Например, вне класса, - это явная ошибка компиляции. Я бы еще понял, если бы это был static, тогда можно было бы писать следующим образом:
C++
1
2
3
4
5
struct Array {
        static char arr[];
};
 
char Array::arr[5];
А в данном случае не понимаю
Единственное что могу сказать, лучше так не делать, а использовать STL vector.

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

Добавлено через 1 час 58 минут
Цитата Сообщение от Андрей2011 Посмотреть сообщение
чем может грозить мне создание массива без ограничения длинны.
Набросал примерчик, демонстрирующий чем же именно может грозить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
struct Bad {
   int a[];
   int b;
};
 
int main() {
   Bad bad;
   
   // Записываем в "b" некоторое значение
   bad.b = 5;
   std::cout << bad.b << std::endl;
   
   // Записываем в "a[0]" некоторое значение
   bad.a[0] = 10;
   std::cout << bad.a[0] << std::endl;
   
   // А теперь посмотрим, что находится в "b"
   std::cout << bad.b << std::endl;
   return 0;
}
У меня получается вот такой результат:
Code
1
2
3
5
10
10
3
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
14.12.2011, 13:44  [ТС]
Ну...видимо в классе он, массив, работает как динамический...не знаю. В любом случае у меня все работает.
Ну опять же просто другого варианта не нашел.
0
Заблокирован
14.12.2011, 13:52
Цитата Сообщение от Андрей2011 Посмотреть сообщение
Ну...видимо в классе он, массив, работает как динамический...не знаю. В любом случае у меня все работает.
1. "видимо" - плохой подход. Либо ты знаешь, как работает твой код. Либо не знаешь.
В последнем случае ты - быдлокодер. А народная мудрость гласит: код работает так, как он выглядит.

2. Статик/стековые массивы никогда не были, и не будут динамическими. И работать "как динамические" тоже не будут. На с++ вообще нет понятия "динамический массив".
0
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
14.12.2011, 17:30  [ТС]
Само ты быдлокодер.
"видимо" - пишут люди которые не уверены в том что говорят.
"динамический массив" - имелось ввиду что память на массив выделяется динамическая. Очевидные вещи вроде. Если такой весь умный, то скажи как мне задать массив нужной мне длинны при создании класса. А еще лучше 2мерный массив. А если не знаешь то <вырезано> спамить порядочным людям!!
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
14.12.2011, 17:56
Цитата Сообщение от Андрей2011 Посмотреть сообщение
задать массив нужной мне длинны при создании класса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <cstddef>
#include <iostream>
#include <typeinfo>
 
template< class T, std::size_t M, std::size_t N >
class my {
    static const std::size_t rows = M;
    static const std::size_t cols = N;
    T matrix[M][N];
public:
    my()
    {
        std::cout << typeid(matrix).name() << "\trows " << rows << "\tcols " << cols << std::endl;
    }
};
 
int main()
{
    my< int, 10, 5 > A;
    my< char, 5, 10 > B;
    return 0;
}
1
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
14.12.2011, 18:11  [ТС]
о как. спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.12.2011, 18:11
Помогаю со студенческими работами здесь

Ошибка "Constant expression is required"
Здравствуйте. Программа для формирования одномерного массива из матрицы размером N*N, компилятор turbo c++, выдает такую ошибку: Constant...

Не могу понять в чем ошыбка [C++ Error] SKLAD.cpp(32): E2313 Constant expression required
Не могу найти ошибку SKLAD.cpp(32): E2313 Constant expression required точнее понять из-а чего она и как ее исправить #include...

При задании динамического массива Constant expression required
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt; #pragma hdrstop #include...

Constant expression required
Жалуется на массив с ошибкой &quot;Constant expression required&quot;. В гугле не ищется. float arr; #include &lt;stdio.h&gt; #include...

E2313 Constant expression required
Здаствуйте. Сегодня столкнулся с одной нелепой проблемой. Нужно С++ код передалать в С. Есть в С++: const int N = 4; char l, s; int...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru