friend

Lotles
Сообщения: 59
Зарегистрирован: 03 июл 2010, 12:42

Почему не работает ?

Код: Выделить всё

#include "stdafx.h"
#include <conio.h>
using namespace std;
class Point{
public:
    double x,y;
	Point operator*(int n, Point pt){
    Point new_pt;
    new_pt.x=pt.x*n;
    new_pt.y=pt.y*n;
    return new_pt;
	}
};
int main()
{
    Point point1,point2;
    point2.x=2.0;
    point2.y=3.0;
    point1=5*point2;
}
guest_48
Сообщения: 6
Зарегистрирован: 03 июл 2010, 18:57

Не смотря на просто отвратительный стиль и манеру написанного, передачи и получения параметров по значению, непринятия принципов ООП... а так же, как по-мне отсутствие смысла в данной операции "*"...

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

Код: Выделить всё

 Point& operator*( const Point&  pt);
Lotles
Сообщения: 59
Зарегистрирован: 03 июл 2010, 12:42

По другому задам вопрос
Кто нибудь по-человечески объясните мне зачем здесь нужен friend

Код: Выделить всё

#include "stdafx.h"
#include <conio.h>
using namespace std;
class Point{
public:
    double x,y;
   friend  Point operator*(int n, Point pt){
    Point new_pt;
    new_pt.x=pt.x*n;
    new_pt.y=pt.y*n;
    return new_pt;
    }
};
int main()
{
    Point point1,point2;
    point2.x=2.0;
    point2.y=3.0;
    point1=5*point2;
}
guest_48
Сообщения: 6
Зарегистрирован: 03 июл 2010, 18:57

Если касательно этого примера, то он там не нужен.
А если глобально - объявляя функции "друзья" вы позволяете этим функция обращаться к protected и private членам (методам и данным) класса.

Если хотите подискутировать, icq 177123272
Lotles
Сообщения: 59
Зарегистрирован: 03 июл 2010, 12:42

guest_48 писал(а):Если касательно этого примера, то он там не нужен.
А если глобально - объявляя функции "друзья" вы позволяете этим функция обращаться к protected и private членам (методам и данным) класса.

Если хотите подискутировать, icq 177123272
У меня без friend не компилируется, а с ним нормально идет, да и в книге с friend написано, тока непонятно объеснено почему так надо
guest_48
Сообщения: 6
Зарегистрирован: 03 июл 2010, 18:57

Lotles писал(а):У меня без friend не компилируется, а с ним нормально идет, да и в книге с friend написано, тока непонятно объеснено почему так надо

Теперь вам понятно зачем нужно ключевое слово "friend"?

А в качестве книги для начинающих, я рекомендую Стивена Прата "Язык программирования С++"
или читайте "классику" Бьерн Страуструп "Язык программирования С++" 3 издание

А свою книгу лучше сожгите, если этот пример из неё =)
Lotles
Сообщения: 59
Зарегистрирован: 03 июл 2010, 12:42

guest_48 писал(а):Теперь вам понятно зачем нужно ключевое слово "friend"?

А в качестве книги для начинающих, я рекомендую Стивена Прата "Язык программирования С++"
или читайте "классику" Бьерн Страуструп "Язык программирования С++" 3 издание

А свою книгу лучше сожгите, если этот пример из неё =)
Книга C++ без страха, которую я читаю нормальная, просто в этой теме автор немного не понятно объяснил, тем более что с friend прога действительно работает, тока как, -не могу понять, friend обеспечивает доступ к закрытой части класса через объекты- это я знал, значит что то еще делает !
guest_48
Сообщения: 6
Зарегистрирован: 03 июл 2010, 18:57

Не понимаю, что конкретно вы не можете понять, потому что пример достаточно простой. Глобальный оператор делается френдом, friend обеспечивает доступ к закрытой части класса - всё!
Но этот код странный тем, что реализация глобального оператора френда внесена в объявление(тело) класса... такая запись для неокрепшего разума противопоказана, а опытным разработчикам за эту запись следует отбивать руки :)

Обратите внимание, что внутри этого оператора вы не можете написать this->x... что как бы намекает...
Lotles
Сообщения: 59
Зарегистрирован: 03 июл 2010, 12:42

guest_48 писал(а):Не понимаю, что конкретно вы не можете понять, потому что пример достаточно простой. Глобальный оператор делается френдом, friend обеспечивает доступ к закрытой части класса - всё!
Но этот код странный тем, что реализация глобального оператора френда внесена в объявление(тело) класса... такая запись для неокрепшего разума противопоказана, а опытным разработчикам за эту запись следует отбивать руки :)

Обратите внимание, что внутри этого оператора вы не можете написать this->x... что как бы намекает...

Глобальный оператор обеспечивает доступ к закрытой части класса pt.x и pt.y - так x и y объявлены же в public, где тут закрытая часть?
guest_48
Сообщения: 6
Зарегистрирован: 03 июл 2010, 18:57

Вот именно поэтому пример и бессмысленный! :)
Ответить