Тёма
Maxim
Maxim
Кирилл
Кирилл
Пытаюсь добавить его в этот класс
Кирилл
Вопрос, как эго правильно объявить(если это было сделано не правильно) и как его потом правильно инициализировать
Кирилл
На все известные мне способы компилятор ругается например так
cckjYCpJ.ltrans0.ltrans.o*: In function global constructors keyed to 65535_0_BlindController.cpp.o.2468
(.text.startup+0xc8): undefined reference to Queue<DataRecieved>::Queue()
collect2.exe*: error: ld returned 1 exit status
Maxim
Объявлять конструктор не пробовал?
Кирилл
Для Queue?
Кирилл
Maxim
Точнее, реализовывать
Maxim
Все темплейт-классы крайне хуево работают, когда .h/.cpp отдельно
Кирилл
Maxim
И потому как только класс становится шаблонным, всю логику пишут прямо в .hpp файле
Maxim
Вот не будет так работать
Кирилл
Почему и как правильно?
Maxim
Как компилятор, увидев в твоем main.cpp вызов шаблонного конструктора найдет его реализацию?
Maxim
И как компилятор, увидев в queue.cpp реализацию для некого <T> найдет, что в main.cpp она использовалась для конкретного типа?
Maxim
Правильно - писать весь код в хедере, других вариантов я не знаю
Кирилл
ясно а зачем тогда h и cpp как отдельные файлы
Maxim
Ну можно, наверное, в cpp инстанциировать очередь для конкретных типов, и не выносить в хедеры
Кирилл
(я вообще не за такое разбиение сам c#-овец и там вообще все вместе и все понятно
Maxim
Вообще изначально идея - чтобы уменьшать сложность компиляции
Кирилл
А зачем мне инициализация для конкретных типов если у меня вся логика шаблонная(иначе зачем мне шаблонный класс)
Maxim
Вот потому писать весь код в хедере
Maxim
Это единственный способ компилятору инстанциировать его сразу для всех типов, которые он найдет
Кирилл
ясно пошёл переписывать)
Maxim
Ты же понимаешь, что шаблоны - это не генерики и код тупо дублируется?
Кирилл
Тоесть лучше вообще без cpp обойтись, правильно?
Maxim
Тут - да
Кирилл
ну теперь знаю что это разные вещи, знать бы что такое генерики
Maxim
Генерики - это когда один экземпляр кода написан так, что может работать со всеми типами
Maxim
Java и наверное шарп так работают
Кирилл
)))
Кирилл
ясн
Кирилл
Кстати ещё 1 вопрос, можно ли так написать
Maxim
Но вообще я бы не увлекался бы таким стилем программирование под ардуиной (сначала динамически аллоцируемая строка, потом динамически аллоцируемая очередь) и выделил бы статический буфер
Maxim
Вообще каждый раз когда видишь динамическую аллокацию, надо очень долго думать, а действительно ли она нужна и без неё никак
Andy
Maxim
Ой, трупы сами насилуйте, в них я не разбирался. Последний раз, когда я видел дельфи, генериками там и не пахло :D
Кирилл
ну тут это лучший вариант из тех что пришло в голову
Кирилл
Maxim
Ну судя по всему - требуется принимать какие-то строковые данные. Почему бы просто не выделить один строковый буфер?
Maxim
Нет, нельзя, не факт, что NULL - это валидное значение для T
Oleksii
Братва а какой у Mechanic флюс BGA самый ништяковый?
Maxim
Если нужен указатель - так и пиши - T*, тогда будет можно
Кирилл
понял, логично)
Maxim
Но тогда сразу возникает вопрос - а кто ответственен за управление этим указателем?
Кирилл
Не могу перестроиться с шарпов
Maxim
Так что про статические буферы подумай, на 2 килобайтах памяти без MMU маллок - очень большое зло
Maxim
Потому что потом память фрагментируется и песда, может внезапно отказать
Кирилл
ну я сейчас делаю прототип что бы оттестить основной жизненный цикл всех компонентов элемента, потом буду пересматривать внтреннюю логику когда сделаю весь прототип
Maxim
Пересмотр внутренней логики почти неизбежно повлечет пересмотр интерфейса
Maxim
А там уже проще заново переписать
Кирилл
Возможно)
Кирилл
Но для того что бы делать аппаратную часть нужна программная)
Maxim
Например, вот эти прекрасные места, где ты пытаешься структуру перетянуть по значению. Зачем?
Кирилл
а тут пока с ней не доконца все понятно
Maxim
А потом еще по значению вернуть
Maxim
В общем, прежде чем плодить контейнеры, я бы рекомендовал до конца разобраться с C++
Maxim
А иначе получится лютая хрень, которая незаметно десять раз скопирует данные, двадцать раз переаллоцирует, сожрет пару мегабайт памяти и вусмерть фрагментирует хип
Maxim
Вот очередь выше с передачей структур со строками по значению - это первый кандидат на такое поведение
Maxim
Динамический String - второй. Это не JRE с десятью мегабайтами памяти и способностью произвольно двигать указатели
🐧
🐧
🐧
Кирилл
Ну как то получается)
Кирилл
Я же не говорю что вообще без терминов
Maxim
Кирилл
Учитывая что программу я пишу 2-3 день и это первая прога под ++ за последние лет 6-7(до этого это было только в уч. заведении) то оптимизация тут не самое главное, так как пока есть большие проблемы в синтаксисе как таковом.
Maxim
Понимаешь, ты пытаешься запустить это на ардуине. Платформа с 2 килобайтами памяти - не лучшее место для заявления про ненужность оптимизации
Maxim
Было бы на десктопе - да хоть десять раз
Th0r
был бы десктоп с 64 килобайтами - совсем другое дело!
Кирилл
я не говорю что оптимизация не нужна, я говорю про то что: нет норм опыта с ++ c явными указателями и с полным пониманием итогового устройства
нет самого устройства, реализованного(а потребность в реализации прототипов есть)
Кирилл
по этому при наличии данных условий сначала сделать как ополучится что бы реализовать мин функционал для реализации прототипа, паралельно сориентироваться в языке, потом сесть и хоть все переписать