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

Дружественные функции - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
29.09.2010, 15:05     Дружественные функции #1
День добрый.
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
class Distance
{
private:
    int fut;
    int inch;
public:
    Distance():fut(0),inch(0){};
    Distance(int f,int i):fut(f),inch(i){};
    Distance(float f)
    {
        fut=static_cast<int>(f);
        inch=int((f-fut)*12);
    }
    void print()
    {
        cout << "Футы: " << fut << "  дюймы: " << inch << endl;
    }
    friend Distance operator*(Distance d1,Distance d2) // Дружественная фунция
    {
        int i=(d1.fut*12+d1.inch)*(d2.fut*12+d2.inch);
        int f=0;
        while(i>=144)
        {
            i-=144;
            f++;
        }
        return Distance(f,i);
    }
};
У меня такой вопрос: к чему дружественный перегруженый оператор '*'?
Понимаю когда дружественная функция в 2-х классах.... а тут чет как то не могу понять...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2010, 15:05     Дружественные функции
Посмотрите здесь:

C++ Дружественные функции
C++ дружественные функции
C++ Дружественные функции
Дружественные функции C++
C++ Дружественные функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vergil
42 / 36 / 14
Регистрация: 11.11.2009
Сообщений: 238
29.09.2010, 15:37     Дружественные функции #2
А еще код программы.
Где-то там будет что-то типа
C++
1
2
3
Distance *dlin;
dlin=new Distance(x,y);
dlindlin=*dlin;
и вместо этого *dlin; выполнятся тело дружественной функции
Только не понятно зачем здесь дружественная функция, если она является функцией класса.
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
29.09.2010, 15:44  [ТС]     Дружественные функции #3
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    setlocale(LC_ALL,"Russian");
    Distance d1(12.24F);
    Distance d2(14.87F);
    Distance d3;
    d3=12.45F*d1; //Собсна для этого нужна дружественная функция, что бы перегрузить число*класс
    d3.print();
    return EXIT_SUCCESS;
}
Без использования d3=12.45F*d1; можно просто перегрузить оператор
Вот я и не очень пойму что меняет дружественная функция
Vergil
42 / 36 / 14
Регистрация: 11.11.2009
Сообщений: 238
29.09.2010, 16:06     Дружественные функции #4
Здесь, по-моему, ничего.
С тем же успехом можно было написать
C++
1
Distance operator*(Distance d1,Distance d2) // предательски-недружественная функция
Дружественные функции не являются элементами класса, но спецификатор friend отменяет действие спецификаторов private и protected.
А здесь она является элементом-функцией класса. Попробуй удалить friend; Усли все нормально будет, то забудь. Если нет, пиши еще подумаем.
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
29.09.2010, 16:15  [ТС]     Дружественные функции #5
а в том то и дело чтго без ключевого friend оно то не работает

Добавлено через 2 минуты
я отдаленно догадываюсь, что при написании типа d3=12.45F*d1, число float преобразуется конструктором в тип Distance и что бы их умножить и нужна дружественная функции, т.к. каждый экземпляр класса не связан друг с другом
Crudelis
Шаровик затейник
 Аватар для Crudelis
667 / 409 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
29.09.2010, 16:23     Дружественные функции #6
Цитата Сообщение от LineStown Посмотреть сообщение
У меня такой вопрос: к чему дружественный перегруженый оператор '*'?
Понимаю когда дружественная функция в 2-х классах.... а тут чет как то не могу понять...
потому что дружественная функция дает возможность в качестве аргументов передавать 2 разных объекта одного и того же класса, что видно из вашего кода:

Цитата Сообщение от LineStown Посмотреть сообщение
C++
1
friend Distance operator*(Distance d1,Distance d2) // Дружественная фунция
Добавлено через 4 минуты
попробуйте перегрузить просто оператор * и поставить в качестве аргумента 2 объекта класса, компилятор начнет ругаться и говорить что перегрузка оператора * может принимать только 1 аргумент

Добавлено через 1 минуту
Цитата Сообщение от LineStown Посмотреть сообщение
12.45F
первый раз вижу чтоб так описывали число флоат)
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
29.09.2010, 16:33  [ТС]     Дружественные функции #7
Цитата Сообщение от Crudelis Посмотреть сообщение
попробуйте перегрузить просто оператор * и поставить в качестве аргумента 2 объекта класса, компилятор начнет ругаться и говорить что перегрузка оператора * может принимать только 1 аргумент
Ну если суть только в возможно использовать более одного аргумента, то понятно.....

Цитата Сообщение от Crudelis Посмотреть сообщение
первый раз вижу чтоб так описывали число флоат)
ммм а есть другой способ? я как то где то прочитал что 12.45F 11.55D float и double соответственно
Crudelis
Шаровик затейник
 Аватар для Crudelis
667 / 409 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
29.09.2010, 16:47     Дружественные функции #8
Цитата Сообщение от LineStown Посмотреть сообщение
Ну если суть только в возможно использовать более одного аргумента, то понятно.....
дружественная функция получает прямой доступ к полям класса, применяется не только для перегрузки операторов но и в других случаях где нужно работать с объектом одного/двумя классов, попробуй перегрузить оператор + и попробовать сложить ob+3, ошибки не будет, а вот если попробуешь сложить 3+ob здесь уже ошибка, которую можно решить с помощью дружественной функции.
C++
1
2
3
4
5
6
7
Distance operator+(int t)
{
Distance temp;
temp.fut=fut+t;
temp.inch=inch+t;
return temp;
}
В данном вопросе поможет друж функция
C++
1
2
3
4
5
6
7
freind Distance operator+(int t, Distance ob)
{
Distance temp;
temp.fut=ob.fut+t;
temp.inch=ob.inch+t;
return temp;
}
Добавлено через 57 секунд
Цитата Сообщение от LineStown Посмотреть сообщение
ммм а есть другой способ
другой способ в описании переменной это обозначить int a; float b; double c;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2010, 16:50     Дружественные функции
Еще ссылки по теме:

Дружественные функции С++ C++
C++ Дружественные функции. Наследование. Перегрузка функции
Дружественные функции C++

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

Или воспользуйтесь поиском по форуму:
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
29.09.2010, 16:50  [ТС]     Дружественные функции #9
Цитата Сообщение от Crudelis Посмотреть сообщение
другой способ в описании переменной это обозначить int a; float b; double c;
Ну так это при необходимости использовать переменные, а не просто число ....

Добавлено через 47 секунд
А так спасибо за обьяснение, в принципе понял, но надо практиковаться для уверенности
Yandex
Объявления
29.09.2010, 16:50     Дружественные функции
Ответ Создать тему
Опции темы

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