Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> friend 
:(
    Опции темы
Lotles
Дата 2.7.2010, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Зачем здесь friend
Код

   1.
      #include "stdafx.h"
   2.
      #include <conio.h>
   3.
      using namespace std;
   4.
      class Point{
   5.
      public:
   6.
             double x,y;
   7.
             friend Point operator*(int n, Point pt){ //
   8.
                     Point new_pt;
   9.
                     new_pt.x=pt.x*n;
  10.
                     new_pt.y=pt.y*n;
  11.
                     return new_pt;
  12.
             }
  13.
      };
  14.
       
  15.
             int main(){
  16.
                     Point point1,point2;
  17.
                     point2.x=2.0;
  18.
                     point2.y=3.0;
  19.
                     point1=5*point2;
  20.
             }


Это сообщение отредактировал(а) Lotles - 2.7.2010, 19:30
PM MAIL Skype   Вверх
RobinHoodPHD
Дата 2.7.2010, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 12.8.2007
Где: Русь

Репутация: нет
Всего: 2



Бинарная операция определяемая внутри класса должна иметь 1 параметр, при этом вызвавший ее объект считается первым параметром. А Вам видимо нужно перегрузить * на случай "число*Point" поэтому ее объявили дружественной (дружественным функциям должна передаваться ссылка на объект тк this ей не передается), чтобы можно было задать 2 параметра .
Как то так.
PM MAIL   Вверх
Alexeis
Дата 2.7.2010, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(RobinHoodPHD @  2.7.2010,  12:22 Найти цитируемый пост)
 поэтому ее объявили дружественной (дружественным функциям должна передаваться ссылка на объект тк this ей не передается)

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
azesmcar
Дата 2.7.2010, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



RobinHoodPHD

слишком сложно описал, это тоже самое, что и написать
Код

class Point{
public:
    double x,y;
    friend Point operator*(int n, Point pt);
};

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;
}


Цитата(Alexeis @  2.7.2010,  13:36 Найти цитируемый пост)
если она объявлена внутри класса, то это автоматически метод класса

не в этом случае
Цитата

A function can be defined in a friend declaration of a class if and only if the class is a non-local class (9.8),
the function name is unqualified, and the function has namespace scope. [Example:
Код

class M {
friend void f() { } // definition of global f, a friend of M,
// not the definition of a member function
};


Это сообщение отредактировал(а) azesmcar - 2.7.2010, 13:43
PM   Вверх
Alexeis
Дата 2.7.2010, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



azesmcar, я думал для таких случаев используется спецификатор static. Вот жеж чудики авторы С++!


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bsa
Дата 2.7.2010, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Alexeis, причем тут static? Он нужен для создания статического метода, который надо вызывать Class::method(). А тут речь идет о глобальной функции.
PM   Вверх
Alexeis
Дата 2.7.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(bsa @  2.7.2010,  15:24 Найти цитируемый пост)
А тут речь идет о глобальной функции.

  А как же тогда? 
Цитата(azesmcar @  2.7.2010,  12:40 Найти цитируемый пост)
the function name is unqualified, and the function has namespace scope.

  static для функции класса дает 
1) namespace
2) доступ к private полям объекта.

Что в этом случае нам дает friend
1) namespace
2) доступ к private полям объекта.




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RobinHoodPHD
Дата 2.7.2010, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 12.8.2007
Где: Русь

Репутация: нет
Всего: 2



Static дает доступ к private полям??? Oo Это что то новенькое  smile 
Static объявляет метод статическим, т.е. не требующим создания экземпляра самого объекта. К доступу к полям не имеет никакого отношения. 
PM MAIL   Вверх
Alexeis
Дата 2.7.2010, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(RobinHoodPHD @  2.7.2010,  15:35 Найти цитируемый пост)
Static дает доступ к private полям??? Oo Это что то новенькое 

  Ну я не буквоед, как там по стандарту не в курсе, но везде где использую статик функции класса, везде они мне разрешают лазить внутрь. И MSVC и C++ Builder и eVC.

Добавлено через 1 минуту и 46 секунд
RobinHoodPHD, имеется ввиду, есть доступ в случае если указатель на экземпляр передается в качестве параметра функции. Если указатель не передается, То безусловно что не к чему обращаться.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
azesmcar
Дата 2.7.2010, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Alexeis @  2.7.2010,  16:30 Найти цитируемый пост)
  А как же тогда? 

это не static, но и не совсем эквивалент глобальной функции.

Цитата

A friend function defined in a class is in the (lexical) scope of the class in which it is defined. A friend function defined outside the class is not (3.4.1).


рассмотрим такой код
Код

struct A
{
    int a;
    friend void f()
    {
        this->a = 10; // ошибка, f() НЕ member функция
    }
    void call_f()
    {
        return f(); // все в порядке
    }
};

int main()
{
    A t;
    t.f(); // ошибка
    f(); // ошибка
    t.call_f(); // правильно
}


PM   Вверх
Alexeis
Дата 2.7.2010, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Код

class A
{
 private:
    int a; //во вне не виден.
public:
    friend void f1(A* self)
    {
        self->a = 10; 
    }
    static void f2(A* self)
    {
         self->a = 10;
    }
};

....

    A t;
    f1(&t);
    A::f2(&t);



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mes
Дата 2.7.2010, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Alexeis @  2.7.2010,  15:40 Найти цитируемый пост)
везде где использую статик функции класса, везде они мне разрешают лазить внутрь

но при чем тут статик ? позволяет потому что является членом класса..


--------------------
PM MAIL WWW   Вверх
Alexeis
Дата 2.7.2010, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



mes, исходя из этого
Цитата(azesmcar @  2.7.2010,  12:40 Найти цитируемый пост)
the function name is unqualified, and the function has namespace scope.

я подумал будто такая функция попадает область видимости класса. Это же каким нужно было быть smile , чтобы функцию объявленную и реализованную внутри тела класса оставить в исключительно глобальной области видимости. 
  Возможности спецификатора static по отношению к функциям в данном случае поглощают возможности friend (т.е. позволяет сделать все тоже + спрятать от глобальной видимости) .


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
azesmcar
Дата 2.7.2010, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Alexeis @  2.7.2010,  17:55 Найти цитируемый пост)
я подумал будто такая функция попадает область видимости класса. Это же каким нужно было быть smile , чтобы функцию объявленную и реализованную внутри тела класса оставить в исключительно глобальной области видимости. 

да нет же.

Цитата(azesmcar @  2.7.2010,  16:48 Найти цитируемый пост)
A friend function defined in a class is in the (lexical) scope of the class in which it is defined. A friend function defined outside the class is not (3.4.1).


PM   Вверх
bsa
Дата 3.7.2010, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Alexeis @  2.7.2010,  18:55 Найти цитируемый пост)
Это же каким нужно было быть  , чтобы функцию объявленную и реализованную внутри тела класса оставить в исключительно глобальной области видимости. 

Все нормально, иначе бы пришлось делать извращения, чтобы реализовать операторы, первый аргумент которых не объект этого класса (например, методы вывода в поток).
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0717 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.