Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 02.11.2010, 14:50   #1
Lotles
Форумчанин
 
Регистрация: 02.10.2010
Сообщений: 86
Репутация: 10

icq: 565592854
По умолчанию Непонятное вызывание оператора присваивания

Я не пойму почему в
Код:

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, 15:17   #2
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Адрес: Белоруссия
Сообщений: 328
Репутация: 36
По умолчанию

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

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

icq: 565592854
По умолчанию

Допустим так
След вопрос:
Почему после сложения вызывается
Код:

    FloatFraction(){
		set(0, 1);
	}

почему не
Код:

    ProperFraction(){
		set(0, 1);
	}

для инициализации f3, ведь он ProperFraction
Lotles вне форума   Ответить с цитированием
Старый 02.11.2010, 18:23   #4
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Адрес: Белоруссия
Сообщений: 328
Репутация: 36
По умолчанию

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

icq: 565592854
По умолчанию

Зачем вызывается конструктор копирования
Код:

    ProperFraction(const Fraction& src){
		cout << "bla-bla-bla" << endl;
		set(src.Fraction::get_num(), src.get_den());
	}

Почему не оператор присваивания

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

icq: 565592854
Вопрос

Код:

    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 в 14:51.
Lotles вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перезагрузка оператора присваивания 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 20:45


22:13.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru