Перейти к содержанию
    

шаблонный класс - двойная компиляция в разных *.cpp файлах

Я вот что имел ввиду. Тут есть несколько подходов, чтобы не таскать переменные через extern. Эт еще со времён обычного Си усвоил - нехорошая практика с extern, за исключением редких случаев.

Для С++ классы представляют собой набор функций и набор переменных. И все они, которые описаны внутри класса, доступны для всех функций класса. Методы класса можно выносить за пределы класса и помещать их как показано на скрине. Единственная засада тут - проблемы с шаблонами самого класса. Но это косяк языка С++.

image.thumb.png.1908864ac1e85d943401dd3645f6f676.png

Еще существует наследование классов - способ "укрупнения", когда один класс "собирает" в себя другие классы. С наследованиями есть некоторые хитрые штуки типа переопределения виртуальных методов, но это уже тонкости, познаваемые в процессе изучения языка.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как этим пользоваться? Учитывая, что где-то в коде до этого мне нужно определить, будет это <int> или <myStruct> или и то и другое.
Я хочу просто в итоге из main.cpp и из test.cpp иметь доступ к методам ee.
Другими словами я просто хочу писать ee.commit(); ee.begin(); и тд

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только вопрос - а так уж прям и нужно в main() это делать? Быть может, чтение-запись чего-то в еепром делать именно там, где располагается этот функционал? То есть, непосредственно по месту применения. 

Но, допустим, хотите из main. Ладно. Объект ее1 (либо указатель/ссылку на него) можно передать в функцию как параметр, и вместе с ним передадутся все методы класса, связанные с этим объектом. 
Однако, поскольку класс Eeprom у вас шаблонный, то придется сделать финт ушами с наследованием шаблонного класса от базового бесшаблонного и указанием в качестве типа входного параметра базового класса. Довольно муторная конструкция, хотя и позволяет "протолкнуть" через параметр различные типы, лишь бы они наследовались от одного и того же типа. Поэтому в вашем случае тут как бы желательно пересмотреть подход вообще к структуре программы. В начале темы я упоминал, что поскольку запись в еепром (и во флеш МК тоже) выполняется в фиксированном размере - байт, слово, то самому классу Eeprom, реализующему механизмы записи/чтения, разные типы хранения данных не нужны - один фик любой размер, любая структура данных приводится к фиксированному размеру.

 

Снимок экрана 2024-02-19 204138.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

На счет структуры программы - она такая, какая и должна быть. Это общая для всей программы структура данных, которые хранятся энергонезависимо. Пароль вай фай, номер устройства, номер прошивки, статус последней перезагрузки и прочее. Доступ к этим данными нужен отовсюду. Хочется сделать его удобным.


И даже было бы это блажью - очень странно, если её нельзя было реализовать на с++.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отчитываюсь. Удачно удалось унаследовать шаблонный класс, в котором только определяемая пользователем структура, от базового, в котором все функции обработки данных. Обработку данных пришлось переписать на указатели - но это практически то же. Код методов находится в cpp модуле и следовательно собирается отдельно. Теперь все движения с template class/extern template class даже прибавляют немного байт к прошивке - почему не знаю. Но по крайней мере я добился чего хотел. Объект шарится по модулям обычным extern и никакого оверхеда по коду нет. 
Ответы в теме очень помогли разобраться. Всем спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...