Форум программистов, компьютерный форум CyberForum.ru

Объясните, как в данном примере работает friend - C++

Восстановить пароль Регистрация
 
Nikcharn
 Аватар для Nikcharn
71 / 53 / 3
Регистрация: 31.07.2009
Сообщений: 149
20.11.2013, 02:18     Объясните, как в данном примере работает friend #1
C++
1
friend bool operator== (const String& firstStr, const String& secondStr);
Если писать код без friend, то возникает ошибка:
слишком много параметров для этой функции оператора.

Вопрос:
Объясните, как в этом примере работает friend. Что он делает.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 283
Регистрация: 04.12.2011
Сообщений: 7,710
Записей в блоге: 3
20.11.2013, 02:31     Объясните, как в данном примере работает friend #2
Цитата Сообщение от Nikcharn Посмотреть сообщение
Объясните, как в этом примере работает friend. Что он делает.
friend - ключевое слово в объявлении, которое предоставляет объявляемому методу доступ к полям и методам экземпляра. При этом метод не становится методом экземпляра, то есть указатель this ему не передаётся и нужное для сравнение поле нужно передать в виде отдельного параметра. Поэтому их два.
Если объявлять оператор сравнения без него, то то это будет метод экземпляра и доступ к полу firstStr у него будет непосредственно, поэтому передать нужно только вторую строку.
Nikcharn
 Аватар для Nikcharn
71 / 53 / 3
Регистрация: 31.07.2009
Сообщений: 149
20.11.2013, 02:36  [ТС]     Объясните, как в данном примере работает friend #3
Цитата Сообщение от IGPIGP Посмотреть сообщение
friend - ключевое слово в объявлении, которое предоставляет объявляемому методу доступ к полям и методам экземпляра. При этом метод не становится методом экземпляра, то есть указатель this ему не передаётся и нужное для сравнение поле нужно передать в виде отдельного параметра. Поэтому их два.
Если объявлять оператор сравнения без него, то то это будет метод экземпляра и доступ к полу firstStr у него будет непосредственно, поэтому передать нужно только вторую строку.
C++
1
bool operator == (const String& other) const;
То есть можно просто перегрузить оператор следующим способом, и сравнивать this(текущий экземпляр) с other?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 283
Регистрация: 04.12.2011
Сообщений: 7,710
Записей в блоге: 3
20.11.2013, 02:41     Объясните, как в данном примере работает friend #4
Цитата Сообщение от Nikcharn Посмотреть сообщение
То есть можно просто перегрузить оператор следующим способом, и сравнивать this(текущий экземпляр) с other?
Можно. Вы сами выбираете критерии сравнения. Обычно проверяют на равенство все поля-значения и значения по указателям, поэтому принимает такой оператор аж целый экземпляр.
Но если в экземпляре кроме строки ничего нет или остальное для данного алгоритма несущественно то можно принимать тот тип который сочтёте нужным сравнивать.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
20.11.2013, 03:07     Объясните, как в данном примере работает friend #5
Nikcharn, friend даёт доступ другой функции или классу, указанным как дружественные к закрытым членам определяемого класса. Всё!
Дружественные функции не обязательно должны быть операторами
И наоборот:
Перегружаемый оператор не обязательно должен быть дружественным
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
using namespace std;
string operator^(string str, int p){
  string s="";
  for (int i=0; i<p; i++)
     s=s+str;
  return s;
}
int main(){
  string a="alpha";
  string b=a^3;
  cout<<b;
  return 0;
}
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 283
Регистрация: 04.12.2011
Сообщений: 7,710
Записей в блоге: 3
20.11.2013, 03:27     Объясните, как в данном примере работает friend #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Перегружаемый оператор не обязательно должен быть дружественным
Да, поймался я. Некоторые операторы вроде присваивания и сравнения могут быть только членами.
friends для операторов это в основном для размещения оператора справа от объекта. Вроде операторов ввода или вывода в поток или арифметических вроде оператора сложения.
Nikcharn, а зачем может понадобиться оператор сравнения допускающий такое размещение? Чтобы писать:
if(0 == obj)
не допуская возможности ошибки вроде
if(obj = 0)
этого хотелось?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.11.2013, 10:53     Объясните, как в данном примере работает friend #7
Цитата Сообщение от IGPIGP Посмотреть сообщение
Некоторые операторы вроде присваивания и сравнения могут быть только членами.
Присваивания - да, сравнения - нет.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 283
Регистрация: 04.12.2011
Сообщений: 7,710
Записей в блоге: 3
20.11.2013, 13:59     Объясните, как в данном примере работает friend #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Присваивания - да, сравнения - нет.
И это верно. Применение модификатора const для метода не члена приводит к тому, что мой компилятор ругается на знак == для метода не члена:
error C2270: ==: модификаторы недопустимы для функций, не являющихся членами
вот и запутался. Это язык в котором при желании не трудно запутаться.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
struct A{
    A(int a_, string b_){
a=a_;
b=b_;
    }
int a;
string b;
 
bool operator==(const string rhs)const{
return b == rhs;
}
 
bool operator==(const char *rhs)const{
    if(strcmp(b.c_str(), rhs)==1) return true;
    return false;
}
bool operator==(const int &rhs)const{
    return rhs == a;
}
bool operator==(const A &rhs)const{
    return (rhs.a == a) && (rhs.b == b);
}
 
friend bool operator==(const string &lhs, const A &rhs)/*const*/{//модификатор const для метода не члена неприменим
return lhs == rhs.b ;
}
};
 
void foo_aga(bool is_aga){
if(is_aga) cout<<"AGA!"<<endl;
else cout<<"Ne-a!"<<endl;
cout<<endl;
}
 
int main(){
SetConsoleCP (1251); SetConsoleOutputCP (1251);
string aga="aga";
string ne_aga="ne_aga";
int ugu = 123;
int ne_ugu = 456;
A orig(ugu, aga);
A to_cmp_frst(ugu, aga);
A to_cmp_scnd(ugu, ne_aga);
 
cout<< "orig == to_cmp_frst" << endl;
foo_aga(orig == to_cmp_frst);
 
cout<< "orig == to_cmp_scnd" << endl;
foo_aga(orig == to_cmp_scnd);
 
cout<< "orig == string aga" << endl;
foo_aga(orig == aga);
 
cout<< "string aga == orig" << endl;//
foo_aga(aga == orig);
 
bool (*ptr_compire_str_to_obj)(const string &str, const A &obj);
ptr_compire_str_to_obj = operator==;//это забавно
cout<<endl;
cout<<"ptr_compire_str_to_obj(aga, orig ) =  " << endl;
foo_aga(ptr_compire_str_to_obj(aga, orig));
cout<<endl;
 
system("pause");
return 0;
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.11.2013, 14:07     Объясните, как в данном примере работает friend #9
Цитата Сообщение от IGPIGP Посмотреть сообщение
bool operator==(const char *rhs)const{ if(strcmp(b.c_str(), rhs)==1) return true; return false; }
Откуда 1?
A zero value indicates that both strings are equal.
К тому же можно без bool-shit'а:
C++
1
return !strcmp(b.c_str(), rhs);
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 283
Регистрация: 04.12.2011
Сообщений: 7,710
Записей в блоге: 3
20.11.2013, 14:33     Объясните, как в данном примере работает friend #10
Tulosba, да по памяти написал и снова, ляп...
Это интересный пример того когда true == 0 и false != 0
так как например для возврата из main.
Вообще логичнее когда при нормальном исходе 0, а при ненормальном - код ошибки, поэтому для сравнителя int было бы самое то. Но соглашение и поддержка уже не в согласии с таким подходом. В том смысле что объявить int можно, но возвращать 0 когда true - попрощаться с алгоритмами.

Не по теме:


Вот эта строчка интересно может быть написана:

C++
1
2
3
bool (*ptr_compire_str_to_obj)(const string &str, const A &obj);
ptr_compire_str_to_obj = operator /*пробелище)))*/
==;//это забавно
Croessmah, значит пробел запрещён не во всех именах? Но тогда не смотря на то, что нельзя:
C++
1
Straus Trup
мoжно хоть иногда и в сочетании с "==", например:
C++
1
(Straus == Trup)? true : false;
моё мнение брехня неправда, что true, - false конечно

Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.11.2013, 14:42     Объясните, как в данном примере работает friend #11
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это интересный пример того когда true == 0 и false != 0
Тут несколько иная ситуация, т.к. strcmp возвращает по сути 3 значения: больше, меньше, равно. Но подсознательно, используя ее для сравнения, ожидаешь ненулевое значение при равенстве строк.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2013, 15:12     Объясните, как в данном примере работает friend
Еще ссылки по теме:

Объясните использование "double" в данном примере C++
C++ Объясните на данном примере как работать с композицией
Непонятно функционирование цикла while в данном примере C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 283
Регистрация: 04.12.2011
Сообщений: 7,710
Записей в блоге: 3
20.11.2013, 15:12     Объясните, как в данном примере работает friend #12
Цитата Сообщение от Tulosba Посмотреть сообщение
Тут несколько иная ситуация, т.к. strcmp возвращает по сути 3 значения: больше, меньше, равно.
Конечно. Но в принципе при написании своего сравнителя или метода в парсинге например, может оказаться удобным возможность вернуть 0 когда результат ожидаем и иметь кучу вариантов возврата для для разных не ожидаемых.
Цитата Сообщение от Tulosba Посмотреть сообщение
используя ее для сравнения, ожидаешь ненулевое значение при равенстве строк.
Вот-вот, - инерция мысли.
Yandex
Объявления
20.11.2013, 15:12     Объясните, как в данном примере работает friend
Ответ Создать тему
Опции темы

Текущее время: 12:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru