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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2010, 13:50   #1
Lotles
Пользователь
 
Регистрация: 02.10.2010
Сообщений: 86
По умолчанию Непонятное вызывание оператора присваивания

Я не пойму почему в
Код:
f3=f1+f2
вызывается
Код:
Fraction operator+(const Fraction& other){
        return add(other);
        }
У нас f2 имеет тип ProperFraction, а в аргументе operator+ Fraction
Код:
#include <stdafx.h>
#include "Fraction.h"
using namespace std;
class FloatFraction : public Fraction {
public:
    FloatFraction(){
        set(0, 1);
    }
    FloatFraction(int n, int d){
        set(n, d);
    }
    FloatFraction(int n){
        set(n, 1);
    }
    double get_float(){
      return static_cast<double>(get_num())/get_den();
    }
    FloatFraction(const Fraction& src) {
         set(src.get_num(), src.get_den());     
         printf ("zzzzzzzzz\n");
     }
};
class ProperFraction : public FloatFraction {
public:
    ProperFraction(){
        set(0, 1);
    }
    ProperFraction(int n, int d){
        set(n, d);
    }
    ProperFraction(int n){
        set(n, 1);
    }
    ProperFraction(const Fraction& src){
        set(src.Fraction::get_num(), src.get_den());
    }
    void pr_proper(ostream& os){
            if (get_whole() != 0)
            os << get_whole() << " ";
            os << get_num() << "/" << get_den();
        }
        int get_whole(){
                int n = Fraction::get_num();
                return n / get_den();
        }
        int get_num(){
                int n = Fraction::get_num();
                return n % get_den();
        }
};
int main() {
    ProperFraction f1(1,2),f2(5,6),f3;
    _asm int 3;
    f3=f1+f2;
    cout << "Value of f3 is ";
    f3.pr_proper(cout);
    cout << endl;
    cout << "Float value of is " << f3.get_float() << endl;
    return 0;
}
Вот Fraction.h
Код:
#include "stdafx.h"
#include "conio.h"
using namespace std;
class Fraction{
private:
    void normalize(){
        if (den == 0 || num == 0) {
        num = 0;
        den = 1;
        }
    }
    int gcf(int a, int b){
        if (a % b == 0)
        return abs(b);
    else
        return gcf(b, a % b);
    }
    int lcm(int a, int b){
        return (a/gcf(a,b)*b);
    }
public:
    int num, den;
    Fraction(){
        set(0, 1);
    }
    Fraction(int n, int d){
        set(n, d);
    }
    Fraction(int n){
        set(n,1);
    }
    Fraction(const Fraction& src){
        set(src.num,src.den);
    }
    void set(int n, int d){
        num = n; den = d; normalize();
    }
    int get_num() const{
        return num;
    }
    int get_den() const{
        return den;
    }
    Fraction add(const Fraction& other){
        Fraction fract;
    int lcd = lcm(den, other.den);
    int quot1 = lcd/den;
    int quot2 = lcd/other.den;
    fract.set(num * quot1 + other.num * quot2, lcd);
    fract.normalize();
    return fract;
    }
    Fraction mult(const Fraction& other){
        Fraction fract;
    fract.set(num * other.num, den * other.den);
    fract.normalize();
    return fract;
    }
    Fraction operator+(const Fraction& other){
        return add(other);
        }
    Fraction operator=(const Fraction& src){
        set(src.num, src.den);
        cout << "6666666666666" << endl;
        return *this;
    }
    Fraction operator*(const Fraction& other){
        return mult(other);
    }   
    friend ostream& operator << (ostream& os, Fraction& fr){
        os << fr.num << "/" << fr.den;
        return os;
    }
};
Lotles вне форума Ответить с цитированием
Старый 02.11.2010, 14:17   #2
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Потому что ProperFraction наследник от Fraction.
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux

Последний раз редактировалось ozo; 02.11.2010 в 14:20.
ozo вне форума Ответить с цитированием
Старый 02.11.2010, 15:24   #3
Lotles
Пользователь
 
Регистрация: 02.10.2010
Сообщений: 86
По умолчанию

Допустим так
След вопрос:
Почему после сложения вызывается
Код:
    FloatFraction(){
		set(0, 1);
	}
почему не
Код:
    ProperFraction(){
		set(0, 1);
	}
для инициализации f3, ведь он ProperFraction
Lotles вне форума Ответить с цитированием
Старый 02.11.2010, 17:23   #4
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

С чего вы так решили ? )
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 02.11.2010, 18:18   #5
Lotles
Пользователь
 
Регистрация: 02.10.2010
Сообщений: 86
По умолчанию

Зачем вызывается конструктор копирования
Код:
    ProperFraction(const Fraction& src){
		cout << "bla-bla-bla" << endl;
		set(src.Fraction::get_num(), src.get_den());
	}
Почему не оператор присваивания

Последний раз редактировалось Lotles; 02.11.2010 в 18:20.
Lotles вне форума Ответить с цитированием
Старый 04.11.2010, 13:31   #6
Lotles
Пользователь
 
Регистрация: 02.10.2010
Сообщений: 86
Вопрос

Код:
    Fraction add(const Fraction& other){
        Fraction fract;
    int lcd = lcm(den, other.den);
    int quot1 = lcd/den;
    int quot2 = lcd/other.den;
    fract.set(num * quot1 + other.num * quot2, lcd);
    fract.normalize();
    return fract;
Код:
    return fract;
А зачем вообще делается копия, есть один fract , зачем еще делать ?

А this в конструкторе копирования чем является ?
А что вызвало
Код:
    ProperFraction(const Fraction& src){
		cout << "bla-bla-bla" << endl;
		set(src.Fraction::get_num(), src.get_den());
	}
Конструктор копирования вызывается в следующих случаях:
1) Когда объект передается в качестве возвращаемого значения функции
2) Когда один объект используется другого
3) Когда объект стоит в аргументе
Не один случай не подходит

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


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перезагрузка оператора присваивания Tanya881103 Общие вопросы C/C++ 4 10.06.2010 15:47
использование условного оператора в теле оператора цикла с условием машко Помощь студентам 2 21.06.2009 23:55
ошибка при вызывание сторед процедуры vasylshvv Общие вопросы .NET 2 01.10.2008 12:15
Вызывание процедуры в другой процедуре Dura4ok Общие вопросы Delphi 7 22.01.2008 19:45