Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2010, 01:52   #1
Aleksandr_Yanov
Подтвердите свой е-майл
 
Регистрация: 13.06.2010
Сообщений: 39
Вопрос Есть готовый пример.Создание функций friend

Здравствуйте. Скажите пожалуйста,правильно ли созданы и работают friend-функции.
Этот код нужно было изменить,так,чтобы все перегруженные операции были реализованы дружественными функциями.
Код:
#ifndef MYTIME3_H_
#define MYTIME3_H_
#include <iostream>

class Time
{
private:
    int hours;
    int minutes;
public:
    Time();
    Time(int h, int m = 0);
    void AddMin(int m);
    void AddHr(int h);
    void Reset(int h = 0, int m = 0);
    Time operator+(const Time & t) const;
    Time operator-(const Time & t) const;
    Time operator*(double n) const;
    friend Time operator*(double m, const Time & t)
        { return t * m; }   // inline
    friend std::ostream & operator<<(std::ostream & os, const Time & t);

};
#endif
***************
#include "mytime3.h"

Time::Time()
{
    hours = minutes = 0;
}

Time::Time(int h, int m )
{
    hours = h;
    minutes = m;
}

void Time::AddMin(int m)
{
    minutes += m;
    hours += minutes / 60;
    minutes %= 60;
}
void Time::AddHr(int h)
{
    hours += h;
}

void Time::Reset(int h, int m)
{
    hours = h;
    minutes = m;
}

Time Time::operator+(const Time & t) const
{
    Time sum;
    sum.minutes = minutes + t.minutes;
    sum.hours = hours + t.hours + sum.minutes / 60;
    sum.minutes %= 60;
    return sum;
}

Time Time::operator-(const Time & t) const
{
    Time diff;
    int tot1, tot2;
    tot1 = t.minutes + 60 * t.hours;
    tot2 = minutes + 60 * hours;
    diff.minutes = (tot2 - tot1) % 60;
    diff.hours = (tot2 - tot1) / 60;
    return diff;
}

Time Time::operator*(double mult) const
{
    Time result;
    long totalminutes = hours * mult * 60 + minutes * mult;
    result.hours = totalminutes / 60;
    result.minutes = totalminutes % 60;
    return result;
}

std::ostream & operator<<(std::ostream & os, const Time & t)
{
    os << t.hours << " hours, " << t.minutes << " minutes";
    return os; 
}
*************
#include <iostream>
#include "mytime3.h"

int main(int argc, char *argv[])
{
    using std::cout;
    using std::endl;
    Time aida(3, 35);
    Time tosca(2, 48);
    Time temp;

    cout << "Aida and Tosca:\n";
    cout << aida<<"; " << tosca << endl;
    temp = aida + tosca;     // operator+()
    cout << "Aida + Tosca: " << temp << endl;
    temp = aida* 1.17;  // member operator*()
    cout << "Aida * 1.17: " << temp << endl;
    cout << "10 * Tosca: " << 10 * tosca << endl;

    system("PAUSE");
    return EXIT_SUCCESS; 
}

Подскажите пожалуйста,правильно ли я сделал?

Код:
#ifndef MYTIME3_H_
#define MYTIME3_H_
#include <iostream>

class Time
{
private:
       ...
public:
       ...
       ...
    Time operator*(double n) const;
    //friends
    friend Time operator+(const Time & t1, const Time & t2);
    friend Time operator-(const Time & t1, const Time & t2);
    friend Time operator*(double m, const Time & t)
    { 
        return t * m;
    } 
    friend std::ostream & operator<<(std::ostream & os, const Time & t);

};
****************
#include "mytime3.h"

Time::Time()
{
    
}

Time::Time(int h, int m )
{
   
}

void Time::AddMin(int m)
{
  
}

void Time::AddHr(int h)
{

}

void Time::Reset(int h, int m)
{
   ...
}

Time Time::operator*(double mult) const
{
    Time result;
    long totalminutes = hours * mult * 60 + minutes * mult;
    result.hours = totalminutes / 60;
    result.minutes = totalminutes % 60;
    return result;
}

Time operator+(const Time & t1, const Time & t2)
 {          
            int m = t1.minutes + t2.minutes;
             int op_m = m % 60; 
            int h = t1.hours + t2.hours + m / 60;
            Time sum(h, op_m);
            return sum;
 }
Time operator-(const Time & t1, const Time & t2)
 { 
             int st1 = (t1.hours * 60) + t1.minutes;
             int st2 = (t2.hours * 60) + t2.minutes;
             int h = (st1 - st2) / 60;
             int m = (st1 - st2) % 60;
             Time sum(h, m);
             return sum;
 }

std::ostream & operator<<(std::ostream & os, const Time & t)
{
    ...
}

**********
#include <iostream>
#include "mytime3.h"

using namespace std;

int main(int argc, char *argv[])
{
    using std::cout;
    using std::endl;
    Time aida(3, 35);
    Time tosca(2, 48);
    Time temp;

    cout << "Aida and Tosca:\n";
    cout << aida<<"; " << tosca << endl;
    temp = aida + tosca;
    cout << "Aida + Tosca: " << temp << endl;
    temp = aida * 1.17;
    cout << "Aida * 1.17: " << temp << endl;
    cout << "10 * Tosca: " << 10 * tosca << endl;
    temp = aida - tosca;
    cout<<"Aida - Tosca:"<< temp << endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
Aleksandr_Yanov вне форума Ответить с цитированием
Старый 17.07.2010, 02:44   #2
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Скажите, с какой целью вы объявили дружественным классу один из методов этого класса? Я говорю о том методе, где вы производите перегрузку оператора *. По мойму в этом нет смысла. Кроме того AFAIK дружественные функции должны быть определены вне класса как обычные функции; то есть определение функции:
Time operator*(double m, const Time & t)
{ return t * m; }
нужно вынести из класса, оставив в нем только объявление дружественной функции: friend Time operator*(double m, const Time & t);
Кроме того, функция перегрузки оператора с такой сигнатурой (она принимает два параметра) AFAIK должна быть по любому определена как обычная функция, а не метод класса. Метод класса перегружающий этот оператор должен принимать только один параметр.

Последний раз редактировалось Oleg_SK; 17.07.2010 в 03:01.
Oleg_SK вне форума Ответить с цитированием
Старый 17.07.2010, 03:14   #3
Aleksandr_Yanov
Подтвердите свой е-майл
 
Регистрация: 13.06.2010
Сообщений: 39
По умолчанию

Цитата:
friend Time operator*(double m, const Time & t)
{ return t * m; } // inline
Я понимаю,что определение должно быть за пределами класса.Это из готового кода(не моего). Здесь она как бы как встроенная функция получается,т.к. код короткий в ней сам по себе,то она расположилась в классе.На счёт остального,Вами сказанного, Я немного недопонимаю. Мне по заданию нужно было код изменить,так,чтобы все перегруженные операции были реализованы дружественными функциями.Что я попытался сделать,но судя по всему безуспешно
Aleksandr_Yanov вне форума Ответить с цитированием
Старый 17.07.2010, 03:28   #4
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Aleksandr_Yanov
Похоже, что дружественные функции так все таки можно определять (в теле класса); по крайней мере компилятор не ругается и она вызывается. По этому похоже, что можно оставить код как есть; но я первый раз такое вижу. В общем, все сказанное мной в предыдущем посте можно проигнорировать (я думал, что такой код не будет работать).
Oleg_SK вне форума Ответить с цитированием
Старый 17.07.2010, 03:30   #5
Aleksandr_Yanov
Подтвердите свой е-майл
 
Регистрация: 13.06.2010
Сообщений: 39
По умолчанию

Вы бы как реализовали данный пример?
Aleksandr_Yanov вне форума Ответить с цитированием
Старый 17.07.2010, 03:33   #6
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Максимально похожим на исходный код; вы похоже так и сделали.
Oleg_SK вне форума Ответить с цитированием
Старый 17.07.2010, 03:43   #7
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Единственное, что пока заметил: почему вы не вынесли
Time operator*(double m) const;
в дружественную функцию
Time operator*(time t, double m)
тогда бы у вас было две дружественные функции, перегружающие оператор *:
Код:
	friend Time operator*(double m, const Time & t)
	{ 
		return t * m;
	} 
	friend Time operator*(const Time & t, double mult);
и в код программы, вне определения класса добавить функцию:
Код:
Time operator*(const Time & t, double mult);
	{ 
		Time result;
		long totalminutes = t.hours * mult * 60 + t.minutes * mult;
		result.hours = totalminutes / 60;
		result.minutes = totalminutes % 60;
		return result;
	} 

Последний раз редактировалось Oleg_SK; 17.07.2010 в 04:53.
Oleg_SK вне форума Ответить с цитированием
Старый 17.07.2010, 04:01   #8
Aleksandr_Yanov
Подтвердите свой е-майл
 
Регистрация: 13.06.2010
Сообщений: 39
По умолчанию

Вы имеете ввиду что нужно было изначально сделать так:
friend Time operator-(int p_hour, int p_minutes, const Time & t)
{
...
}

friend Time operator+(int p_hour, int p_minutes, const Time & t)
{
...
}
Но тогда под таких друзей нужно будет переписывать и функции члены класса Time operator+(),operator-()...
Или я Вас не правильно понимаю?
Aleksandr_Yanov вне форума Ответить с цитированием
Старый 17.07.2010, 04:39   #9
Aleksandr_Yanov
Подтвердите свой е-майл
 
Регистрация: 13.06.2010
Сообщений: 39
По умолчанию

Для каждого оператора судя по всему можно создать дублирующие их дружественные функции.Или я не прав,поправьте.
Код:
class Time
{
private:
    int hours;
    int minutes;
public:
    Time();
    Time(int h, int m = 0);
    void AddMin(int m);
    void AddHr(int h);
    void Reset(int h = 0, int m = 0);
    Time operator+(const Time & t) const;//__________operators
    Time operator-(const Time & t) const;//___________operators
    Time operator*(double n) const;//________________operators
  
   friend Time operator+(int h, int m,const Time & t);// определение отдельно 
   friend Time operator-(int h, int m,const Time & t);// определение отдельно 
   friend Time operator*(double m, const Time & t);//это тоже в определение отдельно{ return t * m;}   // inline
    friend std::ostream & operator<<(std::ostream & os, const Time & t);

};

Последний раз редактировалось Aleksandr_Yanov; 17.07.2010 в 04:46.
Aleksandr_Yanov вне форума Ответить с цитированием
Старый 17.07.2010, 04:47   #10
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Aleksandr_Yanov
Перечитайте мой предыдущий пост, т.к. я его недавно отредактировал. Я всего лишь предлагаю убрать из кода объявление и определение метода класса Time перегружающего оператор * (их всего два варианта, а у вас в дружественную функцию вынесен только один из них), заменив его на дружественную функцию; вы все сделали кроме этого...

Последний раз редактировалось Oleg_SK; 17.07.2010 в 04:51.
Oleg_SK вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм Кнута-Морриса-Пратта или Рабина-Карпа (язык С++). Может у кого-нибудь есть готовый рабочий ? Беата Помощь студентам 7 27.03.2010 10:50
Нужно положить готовый дизайн на готовый сайт! Full87 Фриланс 1 16.12.2009 16:18