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

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

27.10.2012, 19:09. Показов 4120. Ответов 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,536
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru