класс — C ++ публичные и частные типы данных

В настоящее время я работаю над главой 7 в книге «Начало работы с ранними объектами C ++» печатной компании Pearson.

Я не могу понять функцию переменной ‘r’ в этом объявлении класса:

class Circle
{  private:
double radius;

public:
void setRadius(double r)
{  radius = r; }

double getArea()
{  return 3.14 * pow(radius, 2); }
};

Почему я не могу просто написать переменную radius, как это?

class Circle
{  private:
double radius;

double getArea()
{  return 3.14 * pow(radius, 2); }
};

Я не понимаю функцию

   public:
void setRadius(double r)
{  radius = r; }

Утверждение.

0

Решение

Радиус приватный. Без этой функции вы не сможете установить радиус снаружи класса. Для того чтобы класс был полезен, вы, скорее всего, захотите создавать объекты типа Circle и устанавливать их радиус. Таким образом, вам нужен некоторый тип функции, чтобы установить этот радиус.

Самый простой и разумный способ решить эту проблему — предоставить функцию-член public внутри самого класса Circle.

Это проще всего сделать с помощью установщика, например, того, что вы показали. Это позволяет вам установить, а затем изменить радиус.

void SetRadius(float r)
{
radius = r;
}

Вы также можете предоставить дополнительный аргумент в конструктор, чтобы гарантировать, что радиус окружности всегда инициализируется предоставленным пользователем значением, или, по крайней мере, установить значение по умолчанию в объявлении radius (в C ++ 11).

0

Другие решения

Техническая причина заключается в том, что «радиус является частным и, следовательно, недоступным извне класса».
Таким образом, изменение радиуса должно быть примерно таким, каким оно управляется публичной функцией-членом, такой как SetRadius,

Если теперь возникает вопрос: «Почему дизайнеры сделали это так, а не просто radius public? «, хорошо … это бесконечные дебаты о том, как надлежащий объектно-ориентированный дизайн должен быть тем, что должно быть публичным, а что не внутри объекта.

Традиционная школа ООП, как правило, делает все данные «частными» и получает к ним доступ или изменяет их с помощью разнообразных функций для обеспечения того, что они называют «инкапсуляцией», и облегчает жизнь в случае необходимости расширения интерфейса для поддержки возможных обратных вызовов или событий.

В этом тривиальном простом случае, ну … все выглядит как пустая трата энергии (а без надлежащей оптимизации компилятора это пустая трата энергии! В истинном физическом смысле). Но, может быть, им нужен был единый интерфейс с чем-то другим.

1

Как функциональное поведение private объясняется в других ответах, прямой доступ к приватному члену вне класса приведет к ошибке времени компиляции.

Если вы спрашиваете Зачем мы используем функции сеттера и делаем некоторые члены частными, это вопрос дизайна. Например; если вам нужно, чтобы радиус был всегда положительным числом, вы можете написать функцию set как;

void setRadius(double r)
{
if(radius >= 0)
radius = r;
else
radius = 0;
}

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

1

Концепция публичного приватного доступа заключается в том, что никто не может получить доступ к приватным переменным только к методам класса, а вы можете получить доступ только к публичным методам из своей основной функции, поэтому функция setRadius отвечает за установку приватной переменной радиуса.

public:
void setRadius(double r)
{  radius = r; }

потому что радиус является частной переменной, поэтому вы должны создать открытую функцию внутри класса, чтобы установить эту переменную, чтобы вы могли установить радиус при создании объекта Circle:

это будет работать, чтобы установить радиус в основной

Circle * test = new Circle;
test.setRadius(7);

но если вы попытались установить радиус напрямую:

Circle * test = new Circle;
test.radius = 7;

это приведет к краху программы Не удается получить доступ к закрытому методу класса

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector