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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 50, средняя оценка - 4.74
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
#1

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

13.12.2011, 17:07. Просмотров 6676. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2011, 17:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка "Constant expression is required" - const в сlass (C++):

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

Ошибка: "case expression not constant" - C++
int draw(char form, int razmer){ switch(form){ case"t":{ int i=0; while(i<=10) { int s=10;

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

Ошибка при сборке многофайлового проекта: "невозможно преобразовать "int" в "const golf" - C++
Сделал многофайловую программу программу, вот она: //golf.h #include <iostream> #ifndef golg_h_ #define golf_h_ const int Len =...

Где ошибка невозможно преобразовать указатель "this" из "const pers" в "pers &" при выводе объектов через cout - C++
Добрый день! Переписал код из книг Лафоре, создание мультимножества из собственных объектов- справочник телефонный, с именем и фамилией. ...

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

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

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

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

For(auto const& val : stime) .cpp(47) : error C2143: синтаксическая ошибка: отсутствие "," перед ":" - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdexcept&gt; #include &lt;locale&gt; #include &lt;cstdlib&gt; #include &lt;string&gt; #include...

Компилатор, ошибка "expected primary-expression before "int" " - C++
код #include &lt;iostream.h&gt; using namespace std; #include &lt;windows.h&gt; int show_big_and_litle(int a, int b, int c) { int...

Невозможно преобразовать параметр 1 из "const wchar_t [12]" в "const char *" - C++
Писал программу. Дошел до наложения текстур. Пытаюсь наложить 4-й час. Много разных ошибок. Все ошибки гуглил. На данный момент ошибка...

Ошибка 6 error C2664: strtok: невозможно преобразовать параметр 1 из "const char *" в "char *" - C++
string s = &quot;555 44 55 66&quot;;//размер строки заранее неизвестен char* p = strtok(s.c_str(), ' '); не нравится такое...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru