Зачем хранить значение параметра функции в частной переменной класса?

Мне просто любопытно, я изучаю библиотеку C++ для TFT-дисплея mcu2.4.

И этот метод я замечаю, когда просматриваю библиотеки C++.

То есть, когда параметр передается через функцию, он сохраняется в частной переменной; вот такой:

HCTFT::HCTFT(byte DisplayType)
{
    _Display = DisplayType;

В чем преимущество этого метода? Какой аналогичный метод используется, когда я хочу сделать это в коде C?

, 👍1

Обсуждение

В C нет классов и частных переменных, поэтому вы не можете сделать это в C?, @user253751

Вам следует прочитать *конструкторы*., @chrylis -cautiouslyoptimistic-

@immibis Я знаю, я просто учитываю, что общие методы в C++ и их эквиваленты в C., @R1S8K


3 ответа


Лучший ответ:

4

Причина в том, что _Display, вероятно, будет использоваться после его создания.

Итак, вы передаете байт во время создания, а затем значение доступно в течение всего времени существования объекта.

В C вы, вероятно, сделаете это следующим образом:

  • Передача переменной (байт DisplayType) в каждую функцию, где требуется значение (вы можете использовать этот способ и в C++, но в C/C++ передача переменной во все необходимые функции затруднительна).
  • Сохранение его в глобальной переменной (статической для этого файла .c); это типичный метод C.

* Добавлено пояснение *

Такая переменная называется переменными класса и обычно делается частной. Причина в том, что другие объекты не могут изменить значение напрямую. Единственный способ изменить переменную:

  1. Инициализируя его в конструкторе класса (как в вашем примере).
  2. Внутри самого класса (любым способом).
  3. С помощью обычного метода Set (например, SetDisplayType). Этот метод может проверить, находится ли переданное значение в пределах диапазона, и в этом классе есть только одна точка входа для его изменения.

Чтобы получить значение, обычно необходимо создать общедоступный метод GetDisplayType. Сама переменная является частной.

,

Хорошо, я понимаю, это стиль программирования. Хм, ладно, я начинаю понимать синтаксис C++. Я просто бегаю по библиотеке. Большую часть времени, когда я работаю с библиотеками C++, я сталкиваюсь с разными вещами; например, частный, общедоступный, встроенный, виртуальный ... и т. д. Есть также вещи, которые я тоже хочу понять, я просто делаю это шаг за шагом, чтобы лучше узнать C++, я думаю, насколько C++ будет эффективен для меня, когда я хочу написать библиотеку., @R1S8K

Что ж, в C++ (или на самом деле в объектно-ориентированном языке) вполне нормально объединять информацию (данные/переменные) и функциональность, а в переменной класса (частной) вы храните данные, принадлежащие этому экземпляру класса., @Michel Keijzers

Хорошо, теперь это мне ясно, так что класс — это просто законченный объект, который имеет свои собственные функции и переменные, и все. Кроме того, есть и другие спецификаторы, которые предоставляют свойство использовать функции или переменные этого класса другими классами, но, конечно, это гораздо более сложная тема, чем мои текущие знания., @R1S8K

Лучше прочитать книгу об объектно-ориентированном дизайне, чем узнать все причины, стоящие за ним. Основная идея такова: хранить данные/функции вместе, сохранять конфиденциальность данных, сохранять функции компактными и общедоступными для других., @Michel Keijzers


2

Мишель Кейзерс довольно хорошо объяснил цель этой идиомы. Просто дополнив его ответ, вы можете сделать то же самое на 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


2

Это больше вопрос Объектно-ориентированного программирования, чем вопрос, связанный с Arduino.

Инкапсуляция — это одна из основ ООП, и по сути вы предоставляете некоторый интерфейс объекту, и внешнему миру не нужно ничего знать о его внутренних компонентах (поэтому невозможно перевести его в несогласованное состояние).

,