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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.83
Voroshek
6 / 6 / 1
Регистрация: 22.08.2011
Сообщений: 75
#1

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

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

C++
1
2
3
4
5
6
7
class MyClass
{
    // ...
private:
    int mont; // число дней в месяце
    int days[mont];
};
Возвращает ошибку error: invalid use of non-static data member. Конечно, советуют использовать вектор. Но я прочитал у Липпмана, какую работу производит вектор при вычислении размера - а ведь если передать размер при создании объекта, можно на этом сэкономить.
Можно ли это разрулить? Или только вектор ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2013, 19:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массив в классе. Ошибка error: invalid use of non-static data member (C++):

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

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

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

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

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

Ошибка invalid use of member - C++
Вот код. if (variety == a1.seta cout << a1.seta; else cout << "This sort is not.Try again." << endl; В ошибке показывает...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
18.01.2013, 19:11 #2
C++
1
2
int mont;
int * days;
А в конструкторе выделить память, например.
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
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];
};
Avazart
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,576
Записей в блоге: 17
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); // Февраль
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
18.01.2013, 20:27 #5
А если 31 или 28 ?
То логичнее использовать динамическое выделение памяти
Avazart
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,576
Записей в блоге: 17
18.01.2013, 20:31 #6
MrGluck, Мудохаться из-за нескольких int-тов ? Явно что больше 31 не будет...
Voroshek
6 / 6 / 1
Регистрация: 22.08.2011
Сообщений: 75
18.01.2013, 20:58  [ТС] #7
Цитата Сообщение от Avazart Посмотреть сообщение
MrGluck, Мудохаться из-за нескольких int-тов ?
Не, ну как... там байт, сям байт... глядишь: 50 Мб плавно превращаются в 200
Avazart
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,576
Записей в блоге: 17
18.01.2013, 21:09 #8
Ну это если у вас ~200 месяцев в году при чем все по 30 дней и то не выйдет....
Цитата Сообщение от Voroshek Посмотреть сообщение
там байт, сям байт... глядишь:
А глядишь и перераспределение ? - то же не дешевое удовольствие...
Voroshek
6 / 6 / 1
Регистрация: 22.08.2011
Сообщений: 75
18.01.2013, 21:37  [ТС] #9
Цитата Сообщение от Schizorb Посмотреть сообщение
А в конструкторе выделить память, например.
Вот над этим вариантом надо будет подумать
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
18.01.2013, 23:00 #10
Voroshek, нужен вариант с дин. памятью?

Добавлено через 4 минуты
Avazart, если класс будет иметь кучу потомков и объектов, то критично, ТС правильно подметил. Ваш вариант подходит (лучше еще сделать const int mont) в рамках лабы. Все зависит от того, что требуется.
Avazart
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,576
Записей в блоге: 17
18.01.2013, 23:02 #11
Цитата Сообщение от MrGluck Посмотреть сообщение
Avazart, если класс будет иметь кучу потомков и объектов, то критично, ТС правильно подметил. Ваш вариант подходит (лучше еще сделать const int mont) в рамках лабы. Все зависит от того, что требуется.
Для его месяцу потомки ?
А вот что если февраль решите сделать январем, а потом июнем итд.. в динамике - делать каждый раз перераспределение куда дороже в плане скорости...
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
18.01.2013, 23:22 #12
Avazart, февраль сделать январем? С трудом представляю необходимость в подобной ситуации, да и с точки зрения объектов это неверно. Всегда надо учиться смотреть вперед а не писать "абы сдать".
Avazart
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,576
Записей в блоге: 17
18.01.2013, 23:29 #13
C++
1
2
3
4
MyClass A(28),B(31);
//...
A = B;
//..
Добавлено через 41 секунду
Цитата Сообщение от MrGluck Посмотреть сообщение
да и с точки зрения объектов это неверно.
А что тут неверно обычное присвоение...
при const будет невозможным при дин.массиве вызовет перераспределение...

Добавлено через 2 минуты
Цитата Сообщение от MrGluck Посмотреть сообщение
Всегда надо учиться смотреть вперед а не писать "абы сдать".
Вот и смотрите ...
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
18.01.2013, 23:34 #14
Цитата Сообщение от MrGluck Посмотреть сообщение
Avazart, февраль сделать январем? С трудом представляю необходимость в подобной ситуации, да и с точки зрения объектов это неверно. Всегда надо учиться смотреть вперед а не писать "абы сдать".
с трудом представляю необходимость наследовать от месяца нечто, что будет записывать в него 100500 дней
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
18.01.2013, 23:42 #15
Avazart, я бы добавил в приват operator= и все. Еще раз говорю,
Цитата Сообщение от MrGluck Посмотреть сообщение
Все зависит от того, что требуется.
Добавлено через 4 минуты
Kuzia domovenok, спокойно:
Летний месяц, зимний месяц. Никто не говорит о 100500 днях в месяце, более того, количество - константа (думаю, что Avazart согласен, что её использование в его примере желательно). В производных классах спокойно можно конкретизировать за счет других параметров.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2013, 23:42
Привет! Вот еще темы с ответами:

Ошибка компиляции "forbids in-class initialization of non-const static member" - C++
Доброго времени суток! Прошу помощи, так как сам понять в чем проблема не могу. Имею вот такой код: #include &quot;iostream&quot; ...

Как объявить в классе static-массив, не используя cpp файлы - C++
Есть шаблон. В шаблон в качестве аргумента надо передать массив. Именно в качестве аргумента шаблона, а не в качестве аргумента методов...

vc++2008 ошибка cmath(21) : error C2039: 'acosf' : is not a member of '`global namespace'' - C++
Использую math.h При компиляции выдает : cmath(21) : error C2039: 'acosf' : is not a member of '`global namespace'' 1&gt;D:\Microsoft...

'operator =' must be a non-static member - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; template &lt;class T&gt; class BinaryMinHeap { public: BinaryMinHeap()...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.01.2013, 23:42
Ответ Создать тему
Опции темы

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