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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
#1

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

29.09.2010, 15:05. Просмотров 2141. Ответов 8
Метки нет (Все метки)

День добрый.
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++
Добрый день. Подскажите как правильно запихнуть данные код в тело дружественной функции. Моё задание:&quot;Напишите программу, вычеркивающую...

Дружественные функции - C++
С дружественными классами разобрался, спасибо. А теперь ф-ции. Киньте пожалуста простой пример: класс(несколько полей), обьект описаный в...

дружественные функции - C++
Тема: дружественные функции Напишите программу обращения слова. Помогите решить на С++

Дружественные функции - C++
Тут выдает ошибку Помогите Ошибка 3 error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает...

дружественные функции - C++
Всем привет!!! Есть код: #include&lt;iostream.h&gt; #include&lt;conio.h&gt; #include&lt;string.h&gt; enum...

Дружественные функции - C++
Создать объект динамический стек. Перегрузить операции +, +=, -= (с извлечением элемента).

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vergil
42 / 36 / 14
Регистрация: 11.11.2009
Сообщений: 243
29.09.2010, 15:37     Дружественные функции #2
А еще код программы.
Где-то там будет что-то типа
C++
1
2
3
Distance *dlin;
dlin=new Distance(x,y);
dlindlin=*dlin;
и вместо этого *dlin; выполнятся тело дружественной функции
Только не понятно зачем здесь дружественная функция, если она является функцией класса.
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
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
Сообщений: 243
29.09.2010, 16:06     Дружественные функции #4
Здесь, по-моему, ничего.
С тем же успехом можно было написать
C++
1
Distance operator*(Distance d1,Distance d2) // предательски-недружественная функция
Дружественные функции не являются элементами класса, но спецификатор friend отменяет действие спецификаторов private и protected.
А здесь она является элементом-функцией класса. Попробуй удалить friend; Усли все нормально будет, то забудь. Если нет, пиши еще подумаем.
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
29.09.2010, 16:15  [ТС]     Дружественные функции #5
а в том то и дело чтго без ключевого friend оно то не работает

Добавлено через 2 минуты
я отдаленно догадываюсь, что при написании типа d3=12.45F*d1, число float преобразуется конструктором в тип Distance и что бы их умножить и нужна дружественная функции, т.к. каждый экземпляр класса не связан друг с другом
Crudelis
Шаровик затейник
672 / 414 / 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
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
29.09.2010, 16:33  [ТС]     Дружественные функции #7
Цитата Сообщение от Crudelis Посмотреть сообщение
попробуйте перегрузить просто оператор * и поставить в качестве аргумента 2 объекта класса, компилятор начнет ругаться и говорить что перегрузка оператора * может принимать только 1 аргумент
Ну если суть только в возможно использовать более одного аргумента, то понятно.....

Цитата Сообщение от Crudelis Посмотреть сообщение
первый раз вижу чтоб так описывали число флоат)
ммм а есть другой способ? я как то где то прочитал что 12.45F 11.55D float и double соответственно
Crudelis
Шаровик затейник
672 / 414 / 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++
Напишите программу, вычеркивающую из данного слова все буквы «а» (так, чтобы, например, из слова «заноза» получилось «зноз»), через...

дружественные функции - C++
Имеется следующий код, содержащий дружественную функцию: mt.h #ifndef MT_H_ #define MT_H_ class Time { private: int...

Дружественные функции - C++
Доброго времени суток! Помогите пожалуйста разобраться с задачей: Создать классы: 1.Класс Машина (фирма, состояние, номер учета); ...


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

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru