Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/41: Рейтинг темы: голосов - 41, средняя оценка - 4.66
6 / 6 / 5
Регистрация: 22.08.2011
Сообщений: 75
1

Массив в классе. Ошибка error: invalid use of non-static data member

18.01.2013, 19:10. Показов 8333. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
class MyClass
{
    // ...
private:
    int mont; // число дней в месяце
    int days[mont];
};
Возвращает ошибку error: invalid use of non-static data member. Конечно, советуют использовать вектор. Но я прочитал у Липпмана, какую работу производит вектор при вычислении размера - а ведь если передать размер при создании объекта, можно на этом сэкономить.
Можно ли это разрулить? Или только вектор ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.01.2013, 19:10
Ответы с готовыми решениями:

Массив в структуре. invalid use of non-static data member
Добрый день. Есть структура, понадобилось добавить в неё массив с дин. размером. struct MyStruct...

Ошибка при сборке проекта - invalid use of non-static data member 'MainWindow::test'
Собственно, сабж. Собираю в QtCreator, но по-моему ошибка не имеет к нему никакого отношения....

Ошибки: "invalid use of non-static data member", "error: from this location"
Здравствуйте. Помогите пожалуйста понять в чём я не прав. Почему компилятор не даёт объявить...

Ошибка: invalid use of non-static member function
#include <iostream> using namespace std; class fraction { fraction(double var_sum) {

19
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
18.01.2013, 19:11 2
C++
1
2
int mont;
int * days;
А в конструкторе выделить память, например.
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
18.01.2013, 19:14 3
C++
1
2
3
4
5
6
7
class MyClass
{
    // ...
private:
    static const int mont = 30; // число дней в месяце
    int days[mont];
};
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.01.2013, 20:07 4
Цитата Сообщение от Voroshek Посмотреть сообщение
о я прочитал у Липпмана, какую работу производит вектор при вычислении размера - а ведь если передать размер при создании объекта, можно на этом сэкономить.
Какую ?
C++
1
2
3
4
    size_type size() const
        {   // return length of sequence
        return (_Myfirst == 0 ? 0 : _Mylast - _Myfirst);
        }
Добавлено через 50 секунд
Цитата Сообщение от Voroshek Посмотреть сообщение
а ведь если передать размер при создании объекта,
Устанавливайте размер вектора сразу... что мешает ?

Добавлено через 3 минуты
Цитата Сообщение от MrGluck Посмотреть сообщение
static const int mont = 30; // число дней в месяце
А если 31 или 28 ?

Добавлено через 6 минут

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MyClass
{
    // ...
private:
    int mont; // число дней в месяце
    int days[31]; // по максимуму 
 
   MyClass(int _mont=31):mont(_mont){}
 
   void some_mehod()
     {
        for(int i=0; i<mont; i++) {  /*  do  something with days[i] */ };
     }
};
//------
MyClass M(28); // Февраль
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
18.01.2013, 20:27 5
А если 31 или 28 ?
То логичнее использовать динамическое выделение памяти
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.01.2013, 20:31 6
MrGluck, Мудохаться из-за нескольких int-тов ? Явно что больше 31 не будет...
0
6 / 6 / 5
Регистрация: 22.08.2011
Сообщений: 75
18.01.2013, 20:58  [ТС] 7
Цитата Сообщение от Avazart Посмотреть сообщение
MrGluck, Мудохаться из-за нескольких int-тов ?
Не, ну как... там байт, сям байт... глядишь: 50 Мб плавно превращаются в 200
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.01.2013, 21:09 8
Ну это если у вас ~200 месяцев в году при чем все по 30 дней и то не выйдет....
Цитата Сообщение от Voroshek Посмотреть сообщение
там байт, сям байт... глядишь:
А глядишь и перераспределение ? - то же не дешевое удовольствие...
0
6 / 6 / 5
Регистрация: 22.08.2011
Сообщений: 75
18.01.2013, 21:37  [ТС] 9
Цитата Сообщение от Schizorb Посмотреть сообщение
А в конструкторе выделить память, например.
Вот над этим вариантом надо будет подумать
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
18.01.2013, 23:00 10
Voroshek, нужен вариант с дин. памятью?

Добавлено через 4 минуты
Avazart, если класс будет иметь кучу потомков и объектов, то критично, ТС правильно подметил. Ваш вариант подходит (лучше еще сделать const int mont) в рамках лабы. Все зависит от того, что требуется.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.01.2013, 23:02 11
Цитата Сообщение от MrGluck Посмотреть сообщение
Avazart, если класс будет иметь кучу потомков и объектов, то критично, ТС правильно подметил. Ваш вариант подходит (лучше еще сделать const int mont) в рамках лабы. Все зависит от того, что требуется.
Для его месяцу потомки ?
А вот что если февраль решите сделать январем, а потом июнем итд.. в динамике - делать каждый раз перераспределение куда дороже в плане скорости...
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
18.01.2013, 23:22 12
Avazart, февраль сделать январем? С трудом представляю необходимость в подобной ситуации, да и с точки зрения объектов это неверно. Всегда надо учиться смотреть вперед а не писать "абы сдать".
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.01.2013, 23:29 13
C++
1
2
3
4
MyClass A(28),B(31);
//...
A = B;
//..
Добавлено через 41 секунду
Цитата Сообщение от MrGluck Посмотреть сообщение
да и с точки зрения объектов это неверно.
А что тут неверно обычное присвоение...
при const будет невозможным при дин.массиве вызовет перераспределение...

Добавлено через 2 минуты
Цитата Сообщение от MrGluck Посмотреть сообщение
Всегда надо учиться смотреть вперед а не писать "абы сдать".
Вот и смотрите ...
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
18.01.2013, 23:34 14
Цитата Сообщение от MrGluck Посмотреть сообщение
Avazart, февраль сделать январем? С трудом представляю необходимость в подобной ситуации, да и с точки зрения объектов это неверно. Всегда надо учиться смотреть вперед а не писать "абы сдать".
с трудом представляю необходимость наследовать от месяца нечто, что будет записывать в него 100500 дней
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
18.01.2013, 23:42 15
Avazart, я бы добавил в приват operator= и все. Еще раз говорю,
Цитата Сообщение от MrGluck Посмотреть сообщение
Все зависит от того, что требуется.
Добавлено через 4 минуты
Kuzia domovenok, спокойно:
Летний месяц, зимний месяц. Никто не говорит о 100500 днях в месяце, более того, количество - константа (думаю, что Avazart согласен, что её использование в его примере желательно). В производных классах спокойно можно конкретизировать за счет других параметров.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.01.2013, 01:24 16
Цитата Сообщение от MrGluck Посмотреть сообщение
Avazart, я бы добавил в приват operator= и все. Еще раз говорю,
И что дальше ? Создаем класс что бы потом им неудобно было дальше пользоваться ?
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.01.2013, 01:28 17
Avazart, я для себя и не ставил целью сделать класс, элементы которого будут присваиваться друг дружке, иногда такая способность и не нужна.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.01.2013, 02:26 18
Ну да городить огороды это нормально...

Цитата Сообщение от MrGluck Посмотреть сообщение
не ставил целью сделать класс,
Впечатление что цели просто не было... была непродуманность...

Добавлено через 1 минуту
Цитата Сообщение от MrGluck Посмотреть сообщение
иногда такая способность и не нужна.
Сказать точнее такая особенность не нужна очень редко...
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
19.01.2013, 02:30 19
Цитата Сообщение от Avazart Посмотреть сообщение
Сказать точнее такая особенность не нужна очень редко...
ничего себе редко!! А для чего вообще создаются объекты классов? Чтоб сидеть на месте и друг у друга методы вызывать что ли? На первом месте в ООП - хранение данных в полях объектов класса. Т.е. классы - просто удобный способ хранить несколько полей вместе. Методы - второстепенны! Структуры наше всё! Попробуйте все доказать обратное
1
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.01.2013, 02:33 20
Попробуйте найти в данной теме хотя бы намек на необходимость noncopyable типа ?

Таким классом-издевательством никто не будет пользоваться...

Как возвратить значение из ф-ции ? Как быть с временными переменными?
Как хранить такие типы в векторе? итд итп...
0
19.01.2013, 02:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.01.2013, 02:33
Помогаю со студенческими работами здесь

Исправить ошибку "invalid use of non-static data member"
class Field { private: int x_user{10}, y_user{10}; const int y{20}, x{20}; char...

Invalid use of member in static member function
Здравствуйте! У меня есть класс: class foo{ public: foo(); ~foo(); int m_number;

Ошибка [Warning] non-static data member initializers only available with -std=c++11 or -std=gnu++11 при компиляции
Доброго времени суток. Компилятор выдает ошибку non-static data member initializers only...

Ошибка "non-static data member initializers only available with -std=c++11 or -std=gnu++11"
Компилирую вот этот код: #include &lt;algorithm&gt; #include &lt;iostream&gt; #include &lt;set&gt; #include...

error C2352: 'OGLDevice::CreateGLWindow' : illegal call of non-static member function
Когда подключаю DLL и компилирую код выдает эту ошибку. В чем проблема? error C2352:...

Compile error method data member not found
Private Sub cmbGroup_AfterUpdate() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn =...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru