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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.56
Вундершмайсер
1 / 1 / 0
Регистрация: 09.07.2012
Сообщений: 36
27.10.2012, 19:09     Как в классе правильно объявить массив с константой в качестве размерности? #1
Приветствую всех!

Написал следующий код:
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).
Подскажите, пожалуйста, в чем моя ошибка? И как оно правильно должно быть?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2012, 19:09     Как в классе правильно объявить массив с константой в качестве размерности?
Посмотрите здесь:

Как правильно объявить массив байтов? C++
C++ Как правильно объявить массив объектов
C++ Как объявить массив объектов одного класса в другом классе, а затем поместить в него объекты?
Объявить статический массив размерности 20. Заполнить его «случайным образом»... C++
C++ Объявить массив? Запросто! Объявить массив массивов? А как это?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
27.10.2012, 19:26     Как в классе правильно объявить массив с константой в качестве размерности? #2
на счет много типов - хз.
на счет массивов. размером массива должно быть константное выражение, известное в во время компиляции. в 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 / 1 / 0
Регистрация: 09.07.2012
Сообщений: 36
27.10.2012, 19:37  [ТС]     Как в классе правильно объявить массив с константой в качестве размерности? #3
на счет 4 и 9 строк - вы абсолютно правы, не углядел. По задумке они действительно не должны быть членами класса (Сейчас их закомментирую). Дело в том, что мне надо создать несколько экземпляров этого класса, которые будут отличаться только массивами arr1 и arr2 (меняться будет как их размерность, так и их содержание). Методы (я их здесь не указал просто дабы не загромождать пост) у всех экземпляров одинаковые. Вот и не соображу никак, как это провернуть.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
27.10.2012, 19:41     Как в классе правильно объявить массив с константой в качестве размерности? #4
ну используйте тогда stl.
для arr1 пойдет вектор строк:
std::vector< std::string > arr1;

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

и никаких проблем с управлением памяти и прочими прелестями, которые вы поимеете, если надумаете с голыми динамическими массивами работать.
Вундершмайсер
1 / 1 / 0
Регистрация: 09.07.2012
Сообщений: 36
27.10.2012, 19:45  [ТС]     Как в классе правильно объявить массив с константой в качестве размерности? #5
Править первый свой пост второй раз не дают (не заслужил пока, видимо ))), поэтому выкладываю подправленный код полностью:
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. После завершения работы конструктора они, по идее, исчезнут, что неприемлемо. В общем, выручайте, други. Я в тупике.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
27.10.2012, 19:57     Как в классе правильно объявить массив с константой в качестве размерности? #6
выделяй динамический массив и возвращай на него указатель.
Или передавай указатель на какой угодно массив,
( выделенный за пределами функции и живущий столько сколько тебе надо)
в качестве аргумента функции
C++
1
WireBare_Open::WireBare_Open(int** array){}
Вундершмайсер
1 / 1 / 0
Регистрация: 09.07.2012
Сообщений: 36
27.10.2012, 20:05  [ТС]     Как в классе правильно объявить массив с константой в качестве размерности? #7
Kuzia domovenok, а можно ли присваивать динамическому массиву список значений? А то инициализация отдельно каждого элемента массива будет выглядеть ужасно. Особенно с двух- и трехмерными массивами (планируются и такие).
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
27.10.2012, 20:47     Как в классе правильно объявить массив с константой в качестве размерности? #8
Есть такая штука как enum трюк.
C++
1
2
3
4
5
6
7
class Foo
{
  enum {
    ArraySize = 10;
  };
  int array[ ArraySize ];
};
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
27.10.2012, 21:39     Как в классе правильно объявить массив с константой в качестве размерности? #9
Цитата Сообщение от Вундершмайсер Посмотреть сообщение
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 );
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2012, 21:53     Как в классе правильно объявить массив с константой в качестве размерности?
Еще ссылки по теме:

C++ Как правильно объявить массив строк c++
Как объявить вектор фиксированной длины в классе? C++
C++ Как объявить текстовую константу в классе?

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

Или воспользуйтесь поиском по форуму:
Вундершмайсер
1 / 1 / 0
Регистрация: 09.07.2012
Сообщений: 36
27.10.2012, 21:53  [ТС]     Как в классе правильно объявить массив с константой в качестве размерности? #10
Всем большое спасибо. Вроде с проблемой разобрался, да еще вдобавок несколько интересных приемов узнал. ))
Yandex
Объявления
27.10.2012, 21:53     Как в классе правильно объявить массив с константой в качестве размерности?
Ответ Создать тему
Опции темы

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