Что тут растолковывать ? После перегрузки опраторы класса стают как бы "внешними", а "внешние" функции не имеют доступа к private-членам класса. Именно поэтому они и определены как friend. Можно сделать изврат: объявить по паре паблик-функций для каждого приватного или защищённого члена-данных класса Set/Get. Я знаю, что это - изврат, зато избавимся от friend.BBB писал(а): Прочитал его несколько раз, но так и не понял, о чем в нем говорится.
Класс "комплексные числа"
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
#define while if
Оптимизация по размеру:
#define struct union
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Ты как обычно доминируешь. Похоже, о внешних и внутренних операторах ты не слышал." писал(а):В реализации он и так доберётся до членов private: внутри класса есть доступ ко всем членам
После перегрузки они "стают" (copyright Airhand) внешними? А до перегрузки, соответственно они внутренними были?" писал(а):После перегрузки опраторы класса стают как бы "внешними", а "внешние" функции не имеют доступа к private-членам класса
Если это операторы КЛАССА, то это всегда операторы с внутренней декларацией. Если операторы внешние, то они не являются операторами КЛАССА. У нас здесь пример как раз внешних операторов.
Научись правильно излагать свои мысли. Твои посты неприятно читать, поскольку они написаны неграмотно, как с точки зрения русского языка, так и с технической точки зрения.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
А это я не то же самое написал по сути?Airhand писал(а):После перегрузки опраторы класса стают как бы "внешними", а "внешние" функции не имеют доступа к private-членам класса. Именно поэтому они и определены как friend.
Если уберешь [Из описания операторов friend], ты в реализации этих операторов не сможешь доступиться к private-полям класса (real и imagine).
Или, спрошу "мягче": чем написанное мной противоречит написанному тобой?
И ты объявил это ахинеей.
А если уж задаться целью убрать 'friend', то это можно сделать и "без извратов". А именно, первым из описанных МНОЙ выше способов (оставил в классе для примера только один оператор сложения):
Код: Выделить всё
class Complex
{
public:
Complex(double the_real, double the_imaginary);
Complex(double real_part);
Complex();
Complex operator + (const Complex& second);
private:
double real;
double imagine;
};
Complex::Complex(double the_real, double the_imaginary): real(the_real), imagine(the_imaginary)
{
//Тело намеренно оставлено пустым
}
Complex::Complex(double real_part): real(real_part), imagine(0)
{
//Тело намеренно оставлено пустым
}
Complex::Complex(): real(0), imagine(0)
{
//Тело намерено отсавлено пустым
}
Complex Complex: :o perator + (const Complex& second)
{
Complex temp;
temp.real = this->real + second.real;
temp.imagine = this->imagine + second.imagine;
return temp;
}
Ты, как всегда, ничего не понял и давай меня грязью поливать.Romeo писал(а):Научись правильно излагать свои мысли. Твои посты неприятно читать, поскольку они написаны неграмотно, как с точки зрения русского языка, так и с технической точки зрения.
Ты сказал дословно:BBB писал(а):А это я не то же самое написал по сути?
То есть в реализации класса недоступна секция private.Если уберешь, ты в реализации этих операторов не сможешь доступиться к private-полям класса (real и imagine).
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
#define while if
Оптимизация по размеру:
#define struct union
Если для тебя слова "реализация этих операторов" (которые в том случае НЕ ЯВЛЯЮТСЯ членами класса) эквивалентны словам "реализация класса", то это твои проблемы. Точнее, проблемы того, что ты плаваешь в теории (половину знаю, а половину не понял). Т.к. (еще раз повторю) у Dragon-а перегрузку бинарных операторов была релизована с помощью функций-НЕЧЛЕНОВ класса.Airhand писал(а):Ты сказал дословно:То есть в реализации класса недоступна секция private.Если уберешь, ты в реализации этих операторов не сможешь доступиться к private-полям класса (real и imagine).
Подучи матчасть - перегрузка БИНАРНЫХ операторов класса.
BBB
Я ошибся: не увидел, что в реализации нет спецификатора класса.
Я ошибся: не увидел, что в реализации нет спецификатора класса.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
#define while if
Оптимизация по размеру:
#define struct union
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Как раз понял больше тебя, так как ты сам признался, что ошибся:" писал(а):Ты, как всегда, ничего не понял
Если бы ты всегда признавал свои ошибки, то таких ожесточённых споров бы не возникало." писал(а):Я ошибся: не увидел, что в реализации нет спецификатора класса.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Если бы вы с BBB признавали свои ошибки, то ...Romeo писал(а):Если бы ты всегда признавал свои ошибки, то таких ожесточённых споров бы не возникало.
А так я говорю
Как будто "реализация этих операторов" не может быть и там и там (и в классе и внешняя). Что он признал свою ошибку ?Ты сказал дословно:
"Если уберешь, ты в реализации этих операторов не сможешь доступиться к private-полям класса (real и imagine).
То есть в реализации класса недоступна секция private. ", а он отвечает "Если для тебя слова "реализация этих операторов" (которые в том случае НЕ ЯВЛЯЮТСЯ членами класса) эквивалентны словам "реализация класса", то это твои проблемы."
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
#define while if
Оптимизация по размеру:
#define struct union
В общем случае МОЖЕТ БЫТЬ - и там, и там (и я об этом минимум два раза упоминал). А в ДАННОМ КОНКРЕТНОМ - в коде, представленном Dragon-ом - во вполне определенном.Airhand писал(а):А так я говорю Как будто "реализация этих операторов" не может быть и там и там (и в классе и внешняя).
В результате получилось, что ты чего-то "не увидел" (<- твои слова), и начинаешь рассуждать и давать советы, исходя из ложной посылки.
Вот и получается, что Romeo прав в том, что ты читаешь написанное "по диагонали".
BBB писал(а):В общем случае МОЖЕТ БЫТЬ - и там, и там (и я об этом минимум два раза упоминал).
Нихрена ты не упоминал, я специально посмотрел. О том, что операторы - внешние есть одно упоминание, а о том что "реализация этих операторов" может быть как внешняя, так и внутреняя - ни разу.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
#define while if
Оптимизация по размеру:
#define struct union