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

Массив в качестве элемента данных класса - C++

Восстановить пароль Регистрация
 
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
22.11.2013, 22:59     Массив в качестве элемента данных класса #1
Допустим, я хочу создать объект, одним из атрибутов которого будет простой одномерный нединамический массив, состоящий, скажем, из 25 элементов.

Я хочу хранить число его элементов в constant variable. Делаю так:
C++
1
2
3
4
5
6
7
8
9
10
11
class Example
{
public:
    Example(...);
    ....
    int getArraySize() const;
private:
    ....
    const int arraySize;
    char array[ arraySize ];
};
C++
1
2
Example::Example(...) : arraySize( 25 )
{...}
В итоге компилятор сообщает, что "граница массива не является константным целым перед токеном ']':
char array[ arraySize ];
__________________^
Вопрос с целью прояснить тонкости.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2013, 22:59     Массив в качестве элемента данных класса
Посмотрите здесь:

Функции в качестве члена класса C++
C++ Шаблон класса в качестве параметра другому шаблону
C++ Объект в качестве элемента класса
Массив данных: вычислить произвидение максимального и минимального элемента C++
C++ двумерный массив в качестве параметра метода класса
C++ Передача enum в качестве аргумента метода класса
C++ Передача члена класса в качестве параметра метода
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Max Dark
В поиске работы
 Аватар для Max Dark
1547 / 1400 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
22.11.2013, 23:14     Массив в качестве элемента данных класса #2
Значение константе присваевывается на месте объявления константы
C++
1
const int arraySize=25;
а таким образом
C++
1
Example::Example(...) : arraySize( 25 )
можно инициализировать только неконстантные члены класса
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
22.11.2013, 23:24     Массив в качестве элемента данных класса #3
StackOverflow, если arraySize для всех экземпляров одинаковый, то можно сделать её static const. Если нет , то как параметр шаблона - иначе никак. В любом случае у всех экземпляров одного класса размер статичесского массива будет одинаковым.
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
22.11.2013, 23:47  [ТС]     Массив в качестве элемента данных класса #4
gray_fox, привет!
Сделал так:
C++
1
2
3
4
5
6
7
8
class Example
{
public:
....
private:
    static const int arraySize = 25;
    char array[ arraySize ];
};
Всё скомпилировалось, но при запуске получаем:
"Ошибка сегментирования (сделан дамп памяти)"

А если вынести инициализацию за пределы интерфейса (в определение), то уже не работает)) Ругается, что. опять же, arraySize не является константной целой. Зато если никак не связывать static const int arraySize и размер массива, но оставить её, при этом инициализацию также провести в определении, то всё компилируется, компануется и запускается.)

Добавлено через 6 минут
Cra3y, со статиком срабатывает, а при объявлении и одновременной инициализации константной целой уже не работает. Компилятор сообщает, происходит неправильное использование элемента данных класса
'const int arraySize', а также указывает на проблемное место, а это как раз присваивание.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
22.11.2013, 23:52     Массив в качестве элемента данных класса #5
C++
1
2
3
4
5
6
7
8
9
10
class Example
{
public:
....
private:
    static const int arraySize;
    char array[ arraySize ];
};
 
const int Example::arraySize = 25;
C++
1
2
3
4
5
6
7
8
class Example
{
public:
....
private:
    enum { arraySize = 25};
    char array[ arraySize ];
};
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
22.11.2013, 23:54     Массив в качестве элемента данных класса #6
StackOverflow, эмм... если честно, я не знаю; так использовать статические интегральные константы вполне нормально вроде.
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
23.11.2013, 00:07  [ТС]     Массив в качестве элемента данных класса #7
MrCold, спасибо, с enum'ом вы здорово придумали!)
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
23.11.2013, 00:09     Массив в качестве элемента данных класса #8
Цитата Сообщение от StackOverflow Посмотреть сообщение
MrCold, спасибо, с enum'ом вы здорово придумали!)
Это не я это Страуструп
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
23.11.2013, 00:15  [ТС]     Массив в качестве элемента данных класса #9
MrCold, к сожалению, ещё руки не дошли до его фундоментального труда.) Чем больше возникает у меня вопросов, с которыми я обращаюсь сюда за помощью, тем больше я понимаю, что его книга "must read".
gray_fox
23.11.2013, 00:54
  #10

Не по теме:

Цитата Сообщение от StackOverflow Посмотреть сообщение
MrCold, к сожалению, ещё руки не дошли до его фундоментального труда.)
До какого из них?) Design and Evolution of C++?

StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
23.11.2013, 01:13  [ТС]     Массив в качестве элемента данных класса #11
offtop:
Programming: Principles and Practice Using C++)

Хотя, чего греха таить, ни до одного пока не дошли))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2013, 02:38     Массив в качестве элемента данных класса
Еще ссылки по теме:

Передача класса в качестве параметра шаблона C++
C++ Использование динамического массива в качестве переменной класса
C++ Массив, как поле данных класса
Изменение статического закрытого элемента данных класса посредством статической элемент-функции класса C++
Массив объектов класса, отладка, доступ к полям элемента массива C++

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

Или воспользуйтесь поиском по форуму:
gray_fox
23.11.2013, 02:38     Массив в качестве элемента данных класса
  #12

Не по теме:

StackOverflow, таки советую, если интересен С++, как-нибудь хотя бы полистать Design & Evolution, это не учебник, но для меня оказалась самой интересной книгой этого автора. Хотя вообще из Строуструпа писатель некудышный, как по мне)

Yandex
Объявления
23.11.2013, 02:38     Массив в качестве элемента данных класса
Ответ Создать тему
Опции темы

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