|
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
|
||||||||||||||||
Массив переменной длины, инициализирующийся при компиляции10.06.2022, 17:48. Показов 3910. Ответов 63
Метки нет (Все метки)
Приветствую всех. Вопрос, наверное, элементарный. Но я банально не знаю, что вбить в Яндекс. В коллекции решенных задач такого не нашел. Если такая тема уже была, бросьте ссылку, плиз.
Допустим, есть класс. Внутри класса должен быть массив.
С++ только начал изучать, до этого много работал на C. Там такое невозможно, только так:
Надеюсь, в C++ есть более элегантное решение?
0
|
||||||||||||||||
| 10.06.2022, 17:48 | |
|
Ответы с готовыми решениями:
63
Массив переменной длины массив переменной длины Передать в C# массив переменной длины. |
|
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
|
||||||
| 15.09.2022, 08:49 [ТС] | ||||||
|
Сделан вот такой вариант:
Добавлено через 8 минут Теперь бы запретить создание объектов класса Buff, и будет счастье. А то ведь сам через полгода забуду и создам :-)
0
|
||||||
|
фрилансер
6506 / 5755 / 1134
Регистрация: 11.10.2019
Сообщений: 15,403
|
|||||||||
| 15.09.2022, 08:56 | |||||||||
|
всё это заменяем на один вот такой класс
0
|
|||||||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||
| 15.09.2022, 09:21 | ||
|
Добавлено: Фига себе!! А почему нельзя ссылку на ru stackoverflow com вставлять?? капец Добавлено через 2 минуты гуглить по фразе "Запрет создания базового класса" Кратко: прописать все конструкторы базового класса в protected:
0
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||||||||
| 15.09.2022, 12:15 | ||||||||
|
Добавлено через 4 минуты Почему не так?
0
|
||||||||
|
Комп_Оратор)
|
||
| 15.09.2022, 12:16 | ||
|
Что кассается std::array<> то он получше си-шного, но размер - параметр времени компиляции, то есть, в принципе то же добро, что мы тут уже имеем. Подумайте о том, какой инвариант вы защищаете своим мнимым инкапсулированием. Какие методы вы хотите передать классу, защищая от записи данный массив. И какая может быть защита, если объявленный интерфейс возвращает указатель на память массива. Вы поставили задачу в стиле шаблонного класса. Решение строится от задачи.
0
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 15.09.2022, 12:17 | ||
Buff как раз призван решить эту проблему.Не понятно, почему вы совсем проигнорировали тот пост.
0
|
||
|
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
|
|||||||
| 15.09.2022, 14:40 [ТС] | |||||||
|
DrOffset, мы, по-моему, так и не поняли друг друга. Вот Ваш код.
Добавлено через 6 минут Яндекс дает такое определение: "Упаковка данных и функций в один компонент (например, класс) и последующий контроль доступа к этому компоненту, создавая тем самым "чёрный ящик" из объекта" В данном случае я создал сложный буфер, на шаблонах, с методами и т.п. Но для функции Func этот объект - черный ящик. Она ничего не знает про то, что он шаблонный. Она получает указатель на объект, и дергает его за публичные методы Read, Write, GetRawDataSize и т.п. Все логично, четко и понятно. Если завтра я решу убрать из класса Buff шаблон и сделаю его на основе vector - менять Func не придется вообще. В этом, по-моему, и смысл инкапсуляции в ООП? Добавлено через 39 секунд KSergey9, спасибо, работает.
0
|
|||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||
| 15.09.2022, 14:59 | |||
|
Поэтому я не пишу никаких функций, а только то (на примере), что относится к концепции.
0
|
|||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
||||||||
| 15.09.2022, 15:06 | ||||||||
|
Это про обобщение, АТД и разделение данных от алгоритмов. . Добавлено через 6 минут Абстрактный класс - класс хотя бы с одним чисто виртуальным методом. Пример
Так вот, объект абстрактного класса "невозможно" создать. Это запрещено в С++, так как не все его методы определенны. Но можно создать указатель на такой класс. И использовать с его помощью полиморфизм.
0
|
||||||||
|
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
|
|
| 15.09.2022, 15:19 [ТС] | |
|
SmallEvil, я же выше сделал на интерфейсе IBuff и Buff. Не понравилось. Методы интерфейса приходится дублировать в каждом наследнике. Иначе из кода все вызывается корректно, а указатель вызывает методы класса-родителя.
Теперь же я просто ввел в код промежуточный указатель. Каждый потомок обновляет его в своем конструкторе. У потомков вообще нет никаких методов, они все их наследуют из базового класса. Возможно, это каким-то термином называется, я не могу сказать. Пока работает, визуально просто.
0
|
|
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||
| 15.09.2022, 15:27 | ||
|
Ну так не зря ж в приведенном примере в базовом классе виртуальный метод был. И как-то это в условиях "экономности" мне не нравится. Хотя наверняка не так уж и дорого.
0
|
||
|
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
|
|
| 15.09.2022, 15:31 [ТС] | |
|
KSergey9, посмотрите посты в этой ветке. В интерфейсе IBuff метод виртуальный. Наследуем от него класс Buff. Указатель вызывает метод класса Buff. Наследуем DoubleBuff : Buff. Указатель на DoubleBuff вызывает метод Buff. Приходится в DoubleBuff переопределять метод, хотя в нем ничего не меняется. Плохо, мне не понравилось.
0
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||||
| 15.09.2022, 15:39 | ||||
|
Это все еще можно решить оставаясь в рамках концепции выделения виртуального интерфейса для шаблона, но предупреждать о таком надо заранее, т.к. решение чуть поменяется. Добавлено через 2 минуты
1
|
||||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|||
| 15.09.2022, 15:44 | |||
|
При том же приеме с не шаблонном базовым классом, это уже проверенная классика. На счет ресурсов, при полиморфизме берется в расчет только время выполнение, необходимое на поддержку механизма. Другие варианты еще хуже, менее гибкие. Но опять же поддержка такого кода будет сложнее. Вывод сам напрашивается...
0
|
|||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||||
| 15.09.2022, 15:56 | ||||
DoubleBuff : Buff : IBuff у виртуального метода, объявленного в IBuff, пропадает виртуальность?! Покажите такой код. Тогда будет предмет. Иначе вы долго будете недоумевать над моими словами, а я - над вашими.
0
|
||||
|
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
|
||||
| 15.09.2022, 16:01 [ТС] | ||||
|
Добавлено через 3 минуты KSergey9, вариант на интерфейсном классе и наследовании описывался в постах #30-#36.
0
|
||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||||||
| 15.09.2022, 16:30 | |||||||
|
Во-вторых, у вас конкретная проблема была именно в этом примере и именно по причине, которую я озвучил. В-третьих, если потребуется, почему бы и не умножить на float (с учетом, естественно, что размер массива задается целым числом)? Добавлено через 11 минут DoubleBuffT, который естественно не видят функции, которые определяются в шаблонном BuffT - они-то работают со своим буфером. Поэтому да, ему приходится "перенацеливать" в DoubleBuffT функции на новый буфер, чтобы ничего не сломалось. Однако на самом деле именно в данном случае второй буфер в наследнике DoubleBuffT не нужен. Можно спокойно использовать буфер из BuffT - он же шаблонный. И тогда получится, что функции прекрасно используются уже унаследованные, и ничего дополнительно переопределять не надо.
0
|
|||||||
|
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
|
||
| 15.09.2022, 16:41 [ТС] | ||
|
Завтра тимлид скажет, что в DoubleBuffer должен быть не один удвоенный буфер, а два одинарных. Плюс нужна функция, которая их переключает. И Ваше изящное решение летит в корзину. И Вам придется сделать еще еще один буфер в наследнике DoubleBuffT. И указатель их не увидит. И вам придется "перенацеливать" функции. Делать все то, о чем с сарказмом пишете. Рад, если Вы работаете с опытным архитектором, который сразу выдает вам каркас, и вы просто нанизываете на него свой код. У меня такого нет. Изящное, но узкоспециализированное решение - хуже, чем обычное, но универсальное.
0
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||
| 15.09.2022, 16:48 | |||
|
Все решения делаются под задачу. Т.к. никаких других задач тут озвучено не было, сделано было именно так, да и если бы они были, я, напомню, здесь совершенно бесплатно, поэтому какую именно часть делать, более универсальна она будет или менее - решаю я сам. Так что здесь вы просто можете сказать мне спасибо, что я показал вам на корень проблемы в вашем примере. Обсуждать что-то за этими рамками не вижу смысла, т.к. мы даже с вами не коллеги. В вашем примере поведение не менялось, а менялся лишь размер. Это разные ситуации.
0
|
|||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|
| 16.09.2022, 00:16 | |
|
А я все ж свои о,1 копеек вставлю, ничего ему такого не нужно, пусь пишет аналог си пдобнызх методов программирования на с++ языке, ибо ему не поддастся это, это, обобщонное программирование.!
Добавлено через 31 минуту DrOffset, не знаю поможет ли это, но у автора есть опыт лишь в процедурном программироавании Добавлено через 3 часа 55 минут Zhavoronkov5, зотите прикол ? С++ придуман не для экономии ресурсов . Хы
0
|
|
| 16.09.2022, 00:16 | |
|
Нужен массив переменной длины с возможностью добавления элементов Ошибка компиляции при работе с float переменной
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|