Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
3 / 3 / 0
Регистрация: 09.07.2012
Сообщений: 36

Как в классе правильно объявить массив с константой в качестве размерности?

27.10.2012, 19:09. Показов 4092. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех!

Написал следующий код:
Unit1.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class WireBare_Open {
    const int METAL_MAX;
    const int SECTION_MAX;
    const int STR_LENGTH;
 
    char* arr1[SECTION_MAX][STR_LENGTH];
    const char** sectionHeaders;
 
    int arr2[METAL_MAX][SECTION_MAX];
    const int* amperageTable;
 
public:
    WireBare_Open();
};
Unit1.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
WireBare_Open::WireBare_Open() : METAL_MAX(2), SECTION_MAX(25), STR_LENGTH(4)
{
    char* arr1[SECTION_MAX][STR_LENGTH] = {"0,5", "0,75", "1", "1,2", "1,5",
        "2", "2,5", "3", "4", "5", "6", "8", "10", "16", "25", "35", "50", "70",
        "95", "120", "150", "185", "240", "300", "400"};
    sectionHeaders = arr1;
 
    int arr2[METAL_MAX][SECTION_MAX] =
    {
     {  0,   0,   0,   0,   0,  21,  24,  27,  32,  36,  39,  46,  60,  75, 105,
      130, 165, 210, 255, 295, 340, 390, 465, 535, 645},
 
     { 11,  15,  17,  20,  23,  26,  30,  34,  41,  46,  50,  62,  80, 100, 140,
      170, 215, 270, 330, 385, 440, 510, 605, 695, 830}
    };
    amperageTable = arr2;
}
Builder 6 в заголовочном файле на 2 строку ругается, что в объявлении класса слишком много типов (Too many types in declaration), а на 7 и 10 строки ругается, что константы не инициализированы (Constant expression required).
Подскажите, пожалуйста, в чем моя ошибка? И как оно правильно должно быть?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.10.2012, 19:09
Ответы с готовыми решениями:

Как правильно объявить массив заданной пользователем размерности
1 cout << "введите количество X: "; 2 cin >> x; 3 double massiv; как сделать правильно, чтобы скомпелировалась программа ? ...

Как правильно объявить vector в классе?
как правильно объявить вектор? #include <vector> #include <algorithm> using namespace std; extern int map; ...

Как объявить массив заданной размерности
Не могу понят, что тут не так, код из с книги. using System; class Hello { public static void Main() { int...

9
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
27.10.2012, 19:26
на счет много типов - хз.
на счет массивов. размером массива должно быть константное выражение, известное в во время компиляции. в METAL_MAX и т.д. такими не являются. чтобы заработало, их нужно сделать либо в виде енумов либо в виде статический констант c инициализацией:

C++
1
2
3
4
5
6
7
8
class C
{
  static const int MAX1 = 10;
  enum { MAX2 = 10 };
 
  int arr1[MAX1];
  int arr2[MAX2]; 
};
еще обратите внимание на строки 4 и 9. это не инициализация мемберов класса, а объявление новых локальных переменных с инициализацией.
1
3 / 3 / 0
Регистрация: 09.07.2012
Сообщений: 36
27.10.2012, 19:37  [ТС]
на счет 4 и 9 строк - вы абсолютно правы, не углядел. По задумке они действительно не должны быть членами класса (Сейчас их закомментирую). Дело в том, что мне надо создать несколько экземпляров этого класса, которые будут отличаться только массивами arr1 и arr2 (меняться будет как их размерность, так и их содержание). Методы (я их здесь не указал просто дабы не загромождать пост) у всех экземпляров одинаковые. Вот и не соображу никак, как это провернуть.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
27.10.2012, 19:41
ну используйте тогда stl.
для arr1 пойдет вектор строк:
std::vector< std::string > arr1;

для arr2 вектор векторов:
std::vector< std::vector<int> > arr2;

и никаких проблем с управлением памяти и прочими прелестями, которые вы поимеете, если надумаете с голыми динамическими массивами работать.
1
3 / 3 / 0
Регистрация: 09.07.2012
Сообщений: 36
27.10.2012, 19:45  [ТС]
Править первый свой пост второй раз не дают (не заслужил пока, видимо ))), поэтому выкладываю подправленный код полностью:
Unit1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
class WireBare_Open {
    const int METAL_MAX;
    const int SECTION_MAX;
    const int STR_LENGTH;
 
    const char** sectionHeaders;
 
    const int* amperageTable;
 
public:
    WireBare_Open();
};
Unit1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
WireBare_Open::WireBare_Open() : METAL_MAX(2), SECTION_MAX(25), STR_LENGTH(4)
{
    char* arr1[SECTION_MAX][STR_LENGTH] = {"0,5", "0,75", "1", "1,2", "1,5",
        "2", "2,5", "3", "4", "5", "6", "8", "10", "16", "25", "35", "50", "70",
        "95", "120", "150", "185", "240", "300", "400"};
    sectionHeaders = arr1;
 
    int arr2[METAL_MAX][SECTION_MAX] =
    {
     {  0,   0,   0,   0,   0,  21,  24,  27,  32,  36,  39,  46,  60,  75, 105,
      130, 165, 210, 255, 295, 340, 390, 465, 535, 645},
 
     { 11,  15,  17,  20,  23,  26,  30,  34,  41,  46,  50,  62,  80, 100, 140,
      170, 215, 270, 330, 385, 440, 510, 605, 695, 830}
    };
    amperageTable = arr2;
}
Еще один недостаток этого кода - время жизни переменных arr1 и arr2. После завершения работы конструктора они, по идее, исчезнут, что неприемлемо. В общем, выручайте, други. Я в тупике.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
27.10.2012, 19:57
выделяй динамический массив и возвращай на него указатель.
Или передавай указатель на какой угодно массив,
( выделенный за пределами функции и живущий столько сколько тебе надо)
в качестве аргумента функции
C++
1
WireBare_Open::WireBare_Open(int** array){}
1
3 / 3 / 0
Регистрация: 09.07.2012
Сообщений: 36
27.10.2012, 20:05  [ТС]
Kuzia domovenok, а можно ли присваивать динамическому массиву список значений? А то инициализация отдельно каждого элемента массива будет выглядеть ужасно. Особенно с двух- и трехмерными массивами (планируются и такие).
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
27.10.2012, 20:47
Есть такая штука как enum трюк.
C++
1
2
3
4
5
6
7
class Foo
{
  enum {
    ArraySize = 10;
  };
  int array[ ArraySize ];
};
1
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
27.10.2012, 21:39
Цитата Сообщение от Вундершмайсер Посмотреть сообщение
Kuzia domovenok, а можно ли присваивать динамическому массиву список значений? А то инициализация отдельно каждого элемента массива будет выглядеть ужасно.
Да.
C++
1
2
3
 // the iterator constructor can also be used to construct from arrays:
  int MyInts[] = { 16, 2, 77, 29 };
  std::vector<int> MyVec (MyInts, MyInts + sizeof MyInts / sizeof *MyInts );
1
3 / 3 / 0
Регистрация: 09.07.2012
Сообщений: 36
27.10.2012, 21:53  [ТС]
Всем большое спасибо. Вроде с проблемой разобрался, да еще вдобавок несколько интересных приемов узнал. ))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.10.2012, 21:53
Помогаю со студенческими работами здесь

Как глобально объявить массив не заданной размерности
Цель: при нажатии на button1 создается массив и заполняется рандомными числами, длину массива получаем из TextBox1. А при нажатии на...

Как объявить строку константой
Как объявить строку константой в СИ?

Как объявить заполненный двумерный массив в классе?
Привет, мне необходимо создать определенный массив 2х2 так, чтобы его было видно их разных функций одного класса. Как я делал: В .h ...

Как в классе реализовать массив произвольной размерности?
Доброго времени суток. Написал класс, который создает одно-дву-трех мерные массивы с возможностью вызова элемента массива по индексу а...

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru