Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456

Вариативный размер массива в разных экземплярах класса

03.03.2026, 06:59. Показов 4909. Ответов 74
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста как задать размер статического массива в каждом экземпляре класса?
C++
1
2
3
4
5
class uart
{
 static const BUF_SIZE = 128;     
 uint8_t buf[BUF_SIZE];    
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.03.2026, 06:59
Ответы с готовыми решениями:

Разное значение переменной класса, в разных экземплярах класса
Вот примерный код: class Test { private: static int countC; static int countD;...

О экземплярах класса
Приветствую. Есть класс Websocket .h/.cpp В websocket.cpp #include "websocket.h" ...

Найти элементы массива А, которые не повторяются и одновременно есть в массиве B в нескольких экземплярах
Всем привет, помогите пожалуйста довести код до ума, что бы выполнялось задание, которое описано в...

74
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,143
03.03.2026, 08:27
Лучший ответ Сообщение было отмечено zss как решение

Решение

Korbofos, только это не статический массив, а массив-поле класса

Можно шаблончик применить
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <cstddef>
#include <cstdint>
 
template<size_t BUF_SIZE>
class uart
{
    uint8_t buf[BUF_SIZE];    
};
 
int main()
{
    uart<128> u1;
    uart<256> u2;
}
3
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13184 / 6820 / 1821
Регистрация: 18.10.2014
Сообщений: 17,260
03.03.2026, 08:55
Цитата Сообщение от Korbofos Посмотреть сообщение
Подскажите пожалуйста как задать размер статического массива в каждом экземпляре класса?
C++
1
2
3
4
5
class uart
{
 static const BUF_SIZE = 128;     
 uint8_t buf[BUF_SIZE];    
}
Во-первых, не забывать указывать типы в объявлениях

C++
1
2
3
4
5
class uart
{
  static const unsigned BUF_SIZE = 128;     
  uint8_t buf[BUF_SIZE];    
};
Во-вторых, я вижу, что размер массива является статическим членом. Сам же массив - никакой не статический. О каком "статическом массиве" тогда идет речь вообще?

Во-третьих, что значит "в каждом экземпляре класса"?
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
03.03.2026, 09:10  [ТС]
А как теперь работать с этим массивом методу этого класса? А то выдаёт ошибку
0
Злостный нарушитель
 Аватар для Verevkin
10642 / 5793 / 1278
Регистрация: 12.03.2015
Сообщений: 26,739
03.03.2026, 09:22
Цитата Сообщение от Korbofos Посмотреть сообщение
А то выдаёт ошибку
Секретную?
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
03.03.2026, 09:25  [ТС]
error: ‘template<short unsigned int BUF_SIZE> class usart’ used without template arguments
0
Злостный нарушитель
 Аватар для Verevkin
10642 / 5793 / 1278
Регистрация: 12.03.2015
Сообщений: 26,739
03.03.2026, 09:39
Цитата Сообщение от Korbofos Посмотреть сообщение
error: ‘template<short unsigned int BUF_SIZE> class usart’ used without template arguments
У меня вот так работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
//#include <cstddef>
#include <cstdint>
 
#define MIN2(a, b) (((a) < (b)) ? (a) : (b))
 
template<size_t BUF_SIZE>
class uart
{
  private:
    uint8_t buf[BUF_SIZE];    
  public:
    void fill_ordered(void)
    {
      for (auto idx = 0; idx != BUF_SIZE; idx++) 
        buf[idx] = idx & 0xFF;
    }
    
    void fill_rand(uint8_t max = 255)
    {
      for (auto &x : buf) 
        x = rand() % max;
    }
    
    void print(size_t from_idx = 0, size_t count = 0)
    {
      auto lim = count ? MIN2(from_idx + count, BUF_SIZE) : BUF_SIZE - from_idx;
      for (auto idx = from_idx; idx < lim; idx++)
        printf("%u ", buf[idx]);
      printf("\n");  
    }
};
 
int main()
{
  uart<64> u1;
  uart<128> u2;
  
  u1.fill_rand();
  u1.print();
  
  u2.fill_ordered();
  u2.print();
    
  return 0;  
}
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
03.03.2026, 11:25  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <const uint16_t BUF_SIZE>
class usart
{                                                         
   uint8_t buf[BUF_SIZE];
 public:
   void init();
  
};
 
void usart::init()
{
 uint16_t a = buf[0]; 
}
 
int main() {
    // your code goes here
 usart<10> u;
 u.init();
}
Code
1
2
3
4
5
6
sol.cpp:13:6: error: ‘template<short unsigned int BUF_SIZE> class usart’ used without template arguments
   13 | void usart::init(){uint16_t a = buf[0]; }
      |      ^~~~~
sol.cpp: In function ‘void init()’:
sol.cpp:13:33: error: ‘buf’ was not declared in this scope
   13 | void usart::init(){uint16_t a = buf[0]; }
0
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,143
03.03.2026, 11:29
Korbofos,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <cstddef>
#include <cstdint>
 
template <uint16_t BUF_SIZE>
class usart
{                                                         
    uint8_t buf[BUF_SIZE];
public:
    void init();
};
 
template <uint16_t BUF_SIZE>
void usart<BUF_SIZE>::init()
{
    uint16_t a = buf[0]; 
}
 
int main()
{
    usart<10> u;
    u.init();
}
только зачем наружу метод вытаскивать ? Пусть внутри сидит
1
Злостный нарушитель
 Аватар для Verevkin
10642 / 5793 / 1278
Регистрация: 12.03.2015
Сообщений: 26,739
03.03.2026, 11:38
Цитата Сообщение от Алексей1153 Посмотреть сообщение
только зачем наружу метод вытаскивать ? Пусть внутри сидит
Ну, наверное, штоп можно было описалово класса пихнуть в h-файл, а реализацию - в cpp.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cstdint>
 
#define TEMPLATE_USART template <const uint16_t BUF_SIZE>
 
TEMPLATE_USART class usart
{                                                         
   uint8_t buf[BUF_SIZE];
 public:
   void init();
};
 
TEMPLATE_USART void usart<BUF_SIZE>::init()
{
 uint16_t a = buf[0]; 
}
 
int main() 
{
    // your code goes here
 usart<10> u;
 u.init();
}
Но уже всё это мне не нравится, т.к. начинает быть похожим на говнокод.
1
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
03.03.2026, 11:58  [ТС]
Да не очень получается, отдельно под каждый уарт свой класс. В принципе как сейчас и есть реализация. Динамическую память не хочется использовать в мк
0
Модератор
Эксперт Java
 Аватар для alecss131
2881 / 1387 / 411
Регистрация: 11.08.2017
Сообщений: 4,427
Записей в блоге: 2
03.03.2026, 12:05
Цитата Сообщение от Verevkin Посмотреть сообщение
описалово класса пихнуть в h-файл, а реализацию - в cpp
Только вот с шаблонными классами свои особенности с подобным делением, далеко не все можно выкинуть в реализацию.
0
Злостный нарушитель
 Аватар для Verevkin
10642 / 5793 / 1278
Регистрация: 12.03.2015
Сообщений: 26,739
03.03.2026, 12:08
Цитата Сообщение от alecss131 Посмотреть сообщение
Только вот с шаблонными классами свои особенности с подобным делением, далеко не все можно выкинуть в реализацию.
Тебе видней. Я в С++ не копенгаген. Пишу сам знаешь на чём. Там с этим проще.
Цитата Сообщение от Korbofos Посмотреть сообщение
Динамическую память не хочется использовать в мк
Тогда мож и С++ лучше в МК не юзать, а довольствоваться чистым С? Особенно, если ты не собираешься использовать в одной прошивке несколько разных экземпляров этого класса.
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
03.03.2026, 12:16  [ТС]
Часто приходиться использовать несколько уартов
0
Злостный нарушитель
 Аватар для Verevkin
10642 / 5793 / 1278
Регистрация: 12.03.2015
Сообщений: 26,739
03.03.2026, 12:26
Цитата Сообщение от Korbofos Посмотреть сообщение
Часто приходиться использовать несколько уартов
тся.
0
 Аватар для Наталья8
621 / 379 / 67
Регистрация: 09.03.2016
Сообщений: 4,075
03.03.2026, 13:56
Нагородили... Буду вникать...

Добавлено через 37 минут
Есть ли случаи, когда C лучше C++? [закрыт]
https://ru.нехорошееслово.com/... 88%D0%B5-c
0
 Аватар для Наталья8
621 / 379 / 67
Регистрация: 09.03.2016
Сообщений: 4,075
03.03.2026, 13:58
Мнения некоторых людей.
Я люблю собирать разные фичи, только нестандартные.
Подходят лучше. Как свои становятся.
0
21 / 18 / 3
Регистрация: 16.12.2025
Сообщений: 146
03.03.2026, 16:41
Цитата Сообщение от Korbofos Посмотреть сообщение
Подскажите пожалуйста как задать размер статического массива в каждом экземпляре класса?
Нет.

Но можно использовать указатель на данные на стеке, и получать размещение, например, из линейного аллокатора.
Выбор аллокатора зависит от использования таких классов.

То что выше предложили - это не один класс. Со всеми вытекающими.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
class Allocator{
   static inline constexpr unsigned SIZE = 65536;
   char buf[SIZE];
   unsigned pos = 0;
public:
   char* get(unsigned size){
      if (size && size <= (SIZE - pos))
         return &buf[(pos+=size)-size];
      throw std::runtime_error("Allocate automatic buffer error");
   }
};
 
struct Class{
   Class(char* buf, unsigned size)
      : buf{buf}, size{size}{
      
   }
   char* buf;
   unsigned size;
};
 
int main(){
   Allocator a;
   Class c1(a.get(128), 128);
   Class c2(a.get(256), 256);
}
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
03.03.2026, 17:54  [ТС]
А если использовать список инициализации? Только ошибку выдаёт
C++
1
usart(uint16_t size) : BUF_SIZE(size) {}
Добавлено через 2 минуты
Не, не получиться
0
Злостный нарушитель
 Аватар для Verevkin
10642 / 5793 / 1278
Регистрация: 12.03.2015
Сообщений: 26,739
03.03.2026, 17:58
Цитата Сообщение от Korbofos Посмотреть сообщение
Не, не получиться
тся
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.03.2026, 17:58
Помогаю со студенческими работами здесь

Найти элементы, присутствующие в нескольких экземплярах либо только в массиве А, либо только в массиве B
Нужно найти элементы, присутствующие в нескольких экземплярах либо только в массиве А, либо только...

Вывести элементы, которые есть в массиве А в нескольких экземплярах и отсутствуют в массиве В
Задание : вывести на экран элементы, которые есть в массиве А в нескольких экземплярах и...

2-мерные массивы: Вызов конструктора портит данные в других экземплярах
Проблема: обнаружилось, что порой пропадают числа из существующих экземпляров класса. Числа...

Элементы, которые есть в нескольких экземплярах в Массиве А и отсутствуют в Массиве В
Задание : вывести на экран элементы, которые есть в массиве А в нескольких экземплярах и...

Найти элементы, которые есть в массиве А в нескольких экземплярах и отсутствуют в массиве В
Задание : вывести на экран элементы, которые есть в массиве А в нескольких экземплярах и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru