Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 50, средняя оценка - 4.74
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
13.12.2011, 17:07     Ошибка "Constant expression is required" - const в сlass #1
Создал класс:
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. Чего ему еще надо, не пойму?!!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2011, 17:07     Ошибка "Constant expression is required" - const в сlass
Посмотрите здесь:

Не могу понять в чем ошыбка [C++ Error] SKLAD.cpp(32): E2313 Constant expression required C++
Expected constant expression; cannot allocate an array of constant size 0 C++
C++ Ошибка lvalue required
Constant expression required. П C++
Ошибка "Constant expression is required" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
13.12.2011, 17:24     Ошибка "Constant expression is required" - const в сlass #2
Цитата Сообщение от Андрей2011 Посмотреть сообщение
FKolTo4=0
Константа на то и константа, что ее менять нельзя.
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
13.12.2011, 17:29  [ТС]     Ошибка "Constant expression is required" - const в сlass #3
да не. там в другом фигня. Впрочем, когда я объявил маасив вот так: MassivTo4Grup[] - проблема отпала. Но вот дальше у меня вот что:

C++
1
2
3
4
TVseGrup VseGrup(13);
 
const short KolTo4 = VseGrup.FKolTo4;
int Mass[KolTo4]; //тут ругается на такую же ошибку. хотя константа же((((
т.е. выходит что из класса я получил константу. Но эта константа отказывается в массив загружаться. Как же быть?
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
13.12.2011, 18:34     Ошибка "Constant expression is required" - const в сlass #4
Андрей2011, используй вектор и все
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
13.12.2011, 18:38     Ошибка "Constant expression is required" - const в сlass #5
Цитата Сообщение от Андрей2011 Посмотреть сообщение
т.е. выходит что из класса я получил константу. Но эта константа отказывается в массив загружаться. Как же быть?
Это константа не compile-time, а как в Си - тупо read-only.
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
13.12.2011, 18:46  [ТС]     Ошибка "Constant expression is required" - const в сlass #6
Вектор? не работал с ними. это тож типа массива?
"me, а как в Си - тупо read-only." - от этого не легче.
Я вышел из положения просто добавив массив в тот вот класс, где вызывал констатну на массив. И в классе у массива не опредлелил кол-во элементов. т.е. поставил [].
Чем мне может это грозить и на сколько этот выход правильный?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
13.12.2011, 18:53     Ошибка "Constant expression is required" - const в сlass #7
Цитата Сообщение от Андрей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 Посмотреть сообщение
Я вышел из положения просто добавив массив в тот вот класс, где вызывал констатну на массив. И в классе у массива не опредлелил кол-во элементов. т.е. поставил [].
Чем мне может это грозить и на сколько этот выход правильный?
Вы не могли бы полностью код показать? А то я не совсем понимаю что именно Вы сделали
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
14.12.2011, 10:35  [ТС]     Ошибка "Constant expression is required" - const в сlass #8
Здорво. Вектор оказывается удобная штука. Но точно ли ывделяется динамическая память? там же нет 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, но выкрутился вот таким способом.
         //а т.к. я раньше подобного не делал то не знаю на сколько мой код вообще правильный
        //и сем может грозить мне создание массива без ограничения длинны.
};
Спасибо за помощь!
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
14.12.2011, 13:02     Ошибка "Constant expression is required" - const в сlass #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Андрей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;
}
У меня получается вот такой результат:
Код
5
10
10
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
14.12.2011, 13:44  [ТС]     Ошибка "Constant expression is required" - const в сlass #10
Ну...видимо в классе он, массив, работает как динамический...не знаю. В любом случае у меня все работает.
Ну опять же просто другого варианта не нашел.
Bers
Заблокирован
14.12.2011, 13:52     Ошибка "Constant expression is required" - const в сlass #11
Цитата Сообщение от Андрей2011 Посмотреть сообщение
Ну...видимо в классе он, массив, работает как динамический...не знаю. В любом случае у меня все работает.
1. "видимо" - плохой подход. Либо ты знаешь, как работает твой код. Либо не знаешь.
В последнем случае ты - быдлокодер. А народная мудрость гласит: код работает так, как он выглядит.

2. Статик/стековые массивы никогда не были, и не будут динамическими. И работать "как динамические" тоже не будут. На с++ вообще нет понятия "динамический массив".
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
14.12.2011, 17:30  [ТС]     Ошибка "Constant expression is required" - const в сlass #12
Само ты быдлокодер.
"видимо" - пишут люди которые не уверены в том что говорят.
"динамический массив" - имелось ввиду что память на массив выделяется динамическая. Очевидные вещи вроде. Если такой весь умный, то скажи как мне задать массив нужной мне длинны при создании класса. А еще лучше 2мерный массив. А если не знаешь то <вырезано> спамить порядочным людям!!
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.12.2011, 17:56     Ошибка "Constant expression is required" - const в сlass #13
Цитата Сообщение от Андрей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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2011, 18:11     Ошибка "Constant expression is required" - const в сlass
Еще ссылки по теме:

C++ Ошибка: deprecated conversion from string constant to ‘char*’
Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *' C++
C++ Как исправить ошибку expression must have a constant value?

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

Или воспользуйтесь поиском по форуму:
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
14.12.2011, 18:11  [ТС]     Ошибка "Constant expression is required" - const в сlass #14
о как. спасибо!
Yandex
Объявления
14.12.2011, 18:11     Ошибка "Constant expression is required" - const в сlass
Ответ Создать тему
Опции темы

Текущее время: 15:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru