Зачем хранить значение параметра функции в частной переменной класса?
Мне просто любопытно, я изучаю библиотеку C++ для TFT-дисплея mcu2.4.
И этот метод я замечаю, когда просматриваю библиотеки C++.
То есть, когда параметр передается через функцию, он сохраняется в частной переменной; вот такой:
HCTFT::HCTFT(byte DisplayType)
{
_Display = DisplayType;
В чем преимущество этого метода? Какой аналогичный метод используется, когда я хочу сделать это в коде C?
@R1S8K, 👍1
Обсуждение3 ответа
Лучший ответ:
Причина в том, что _Display, вероятно, будет использоваться после его создания.
Итак, вы передаете байт во время создания, а затем значение доступно в течение всего времени существования объекта.
В C вы, вероятно, сделаете это следующим образом:
- Передача переменной (байт DisplayType) в каждую функцию, где требуется значение (вы можете использовать этот способ и в C++, но в C/C++ передача переменной во все необходимые функции затруднительна).
- Сохранение его в глобальной переменной (статической для этого файла .c); это типичный метод C.
* Добавлено пояснение *
Такая переменная называется переменными класса и обычно делается частной. Причина в том, что другие объекты не могут изменить значение напрямую. Единственный способ изменить переменную:
- Инициализируя его в конструкторе класса (как в вашем примере).
- Внутри самого класса (любым способом).
- С помощью обычного метода Set (например, SetDisplayType). Этот метод может проверить, находится ли переданное значение в пределах диапазона, и в этом классе есть только одна точка входа для его изменения.
Чтобы получить значение, обычно необходимо создать общедоступный метод GetDisplayType. Сама переменная является частной.
Хорошо, я понимаю, это стиль программирования. Хм, ладно, я начинаю понимать синтаксис C++. Я просто бегаю по библиотеке. Большую часть времени, когда я работаю с библиотеками C++, я сталкиваюсь с разными вещами; например, частный, общедоступный, встроенный, виртуальный ... и т. д. Есть также вещи, которые я тоже хочу понять, я просто делаю это шаг за шагом, чтобы лучше узнать C++, я думаю, насколько C++ будет эффективен для меня, когда я хочу написать библиотеку., @R1S8K
Что ж, в C++ (или на самом деле в объектно-ориентированном языке) вполне нормально объединять информацию (данные/переменные) и функциональность, а в переменной класса (частной) вы храните данные, принадлежащие этому экземпляру класса., @Michel Keijzers
Хорошо, теперь это мне ясно, так что класс — это просто законченный объект, который имеет свои собственные функции и переменные, и все. Кроме того, есть и другие спецификаторы, которые предоставляют свойство использовать функции или переменные этого класса другими классами, но, конечно, это гораздо более сложная тема, чем мои текущие знания., @R1S8K
Лучше прочитать книгу об объектно-ориентированном дизайне, чем узнать все причины, стоящие за ним. Основная идея такова: хранить данные/функции вместе, сохранять конфиденциальность данных, сохранять функции компактными и общедоступными для других., @Michel Keijzers
Мишель Кейзерс довольно хорошо объяснил цель этой идиомы. Просто дополнив его ответ, вы можете сделать то же самое на C, только с немного другой синтаксис:
typedef struct {
byte _Display;
// ...
} HCTFT;
HCTFT_construct(HCTFT *this, byte DisplayType)
{
this->_Display = DisplayType;
// ...
}
Теперь каждая функция, получающая указатель на HCTFT
(HCTFT
«метод») имеет доступ к этим данным как член структуры.
То есть вы имеете в виду, что мне нужно где-то хранить его, будь то частный член класса на C++, переменная структуры на C или глобальная переменная. То есть мне не нужно снова передавать его другим функциям, и я просто могу вызвать его значение из любой функции, не передавая его в эту функцию? Я правильно понимаю?, @R1S8K
@PerchEagle: Вам _не обязательно_: всегда есть много способов сделать одно дело. Я говорю следующее: если вам нужно хранить несколько фрагментов данных для управления TFT-дисплеем, _удобно_ объединить их в единую структуру данных («структуру»). Затем вместо того, чтобы передавать все части в качестве отдельных аргументов каждой функции, работающей с отображением, вы просто передаете указатель на эту единственную структуру. Код становится лучше структурированным и более читабельным. Классы и методы C++ представляют собой, по сути, синтаксический сахар в этом шаблоне программирования., @Edgar Bonet
Замечательно, мне просто нужно погрузиться в написание библиотеки TFT, чтобы научиться использовать эти навыки, я начал помещать определения в заголовочный файл. Но сейчас я думаю, что процесс мог бы быть аналогичным, если бы я использовал свои базовые навыки C для написания библиотеки, хммм. Я нашел хороший пример, такой как этот фрагмент кода. void HCTFT::SetFG(байт R, байт G, байт B)
{
_FGR = Р;
_FGG = Г;
_ФГБ = Б;
}
и теперь в результате переменные подчеркивания объявлены в частном разделе. И теперь, передав их в эту функцию, их можно сразу использовать в других функциях! Хороший., @R1S8K
Это больше вопрос Объектно-ориентированного программирования, чем вопрос, связанный с Arduino.
Инкапсуляция — это одна из основ ООП, и по сути вы предоставляете некоторый интерфейс объекту, и внешнему миру не нужно ничего знать о его внутренних компонентах (поэтому невозможно перевести его в несогласованное состояние).
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Как запрограммировать ардуино на чистом C/C++?
- Массив динамического размера в качестве члена класса
- RtcDateTime' не называет тип
- как отправить аргумент объектам ESP8266WebServer в функции
- Какие Arduino поддерживают ATOMIC_BLOCK?
- GSM-модуль IOT-GA6 Arduino + ошибка CME 58
- Разница между массивом char и массивом unsigned char
В C нет классов и частных переменных, поэтому вы не можете сделать это в C?, @user253751
Вам следует прочитать *конструкторы*., @chrylis -cautiouslyoptimistic-
@immibis Я знаю, я просто учитываю, что общие методы в C++ и их эквиваленты в C., @R1S8K