Другие языки программирования и технологии

Вопрос по классам, С++

Зачем выделять переменные в private, у которых мы в будущем будем изменять значения через специально написанную функцию
class Complex1
{
double real, imaginary;
public:
void SetReal(double real);
void SetImaginary(double real);
Complex1(double real, double imaginary);
};

Complex1::Complex1(double real, double imaginary)
:real(real), imaginary(imaginary) { }

void Complex1::SetReal(double real)
{
this->real = real;
}

void Complex1::SetImaginary(double imaginary)
{
this->imaginary = imaginary;
}
Если можно проще объявить эти переменные в pablic и не писать "эту функцию"?
class Complex2
{
public:
double real, imaginary;
Complex2(double real, double imaginary);
};

Complex2::Complex2(double real, double imaginary)
:real(real), imaginary(imaginary) { }
Ведь результат одинаков?
void main() {
Complex1 z1(0, 10);
Complex2 z2(0, 10);
z1.SetReal(15.5);
z2.real = 15.5;
}
Как раз хороший пример, но недостаточно расписанный. Представь себе, что в будущем (или у какого-то потомка Complex) понадобится поменять внутреннее представление с алгебраической формы на, скажем, показательную (какие-то рассчеты так делаются быстрее), но сохранить вывод как есть, в алгебраической форме. Тогда, если мы обращаемся к переменным через функции доступа (геттеры и сеттеры), достаточно будет переписать эти функции с простого возврата (записи) данных на преобразование; но прямой доступ приведет к очень неприятным последствиям - объект не будет знать, что данные поменяли, и будет внутренне противоречив.
Артем Юдочкин
Артем Юдочкин
50 606
Лучший ответ
Ваня Афанащенко А почему тогда не использовать преобразование через прямой доступ?
z2.real = <преобразование>;
Возможно придется каждый раз писать это преобразование или написать отдельную для этого функция и я возможно ответил на свой вопрос, но возможно у вас есть версия получше.
Чтобы сам класс имел возможность определять и контролировать процесс доступа к его полям. Чтобы извне не было возможности повлиять на код неуместным образом, а также чтобы в любой момент можно было бы изменить класс так, чтобы не пришлось переделывать код другим программистам.
Такова идеология, если прячешь в private - значит тебе надо обезопасить их от доступа из других классов, так как бывает там важные данные, допустим длина выделенной памяти и т. п.
Еще если эти таких переменных штук 100, а для управления достаточно 2, то скрываем лишнее и не выпадает список из кучи нам не нужной информации.
Олег Паюш
Олег Паюш
99 494
Для обеспечения безопасности. При неосторожном использовании, значение переменной можно поменять, из-за этого можно нарушить работу объекта. Для этого как раз и выделяют две функции, которые называют геттерами и сеттарами. Геттер только возвращает значение переменной, и это означает, что случайного изменения не произойдет. А сеттер как раз намеренно меняет содержимое ячейки.
Terlan Nuriyev
Terlan Nuriyev
240
Ваня Афанащенко Так вопрос и состоит в том, что зачем писать (например) сеттер, который изменяет содержимое переменной, если можно просто выделить нужные переменные в pablic и изменить содержимое переменной напрямую? Результат ведь один и тот же?