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

Наследование(Не вызывается конструктор) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вывести последнее слово в тексте http://www.cyberforum.ru/cpp-beginners/thread187386.html
Дается определенное количество слов, нужно вывести последнее.
C++ Простое число(проверьте пожалуйста) Надо определить является ли введенное число простым или состовным. из алгебры известно что если она не делится ни на одно число до корня из самого себя то оно простое.Вот я что-то написала.Но как то не уверена.Посмотрите пожалуйста....хотя вроде работает. //--------------------------------------------------------------------------- #include <vcl.h> #include <conio.h> #include... http://www.cyberforum.ru/cpp-beginners/thread187375.html
C++ В текстовом файле заменить точку на запятую, а запятую на многоточие
Доброго времени суток! есть задание: в текстовом файле заменить точку на запятую, а запятую на ...(три точки) как открыть файл знаю, а вот просканировав его на наличие точек-запятых, как заменить? если заменить 1 знак на 3, то надо же подвигать текст вправо, иначе точки затрут буквы. помогите пжалста?
C++ Вычислить с заданной точностью
Помогите написать программу, плз, я закинул в текстовый файл:
C++ цвет символа в Turbo C++ http://www.cyberforum.ru/cpp-beginners/thread187357.html
подскажите, пожалуйста, как поменять цвет символа в Turbo C++
C++ циклы помогите вывести таблицу 4 3 2 1 0 3 2 1 0 2 1 0 1 0 0 подробнее

Показать сообщение отдельно
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
08.11.2010, 04:17
Мне кажется, надо не разбираться в твоём коде, а показать пример, как сделать лучше.
Во-первых, с конструкторами следует работать не так (как нужно см. ниже). Во-вторых, дектруктор базового класса следует делать виртуальным. В-третьих, не нужно писать лишнего (например, переопределять конструктор копирования). В-четвёртых, не надо наследовать там, где это не нужно (вместо производного класса "float_fraction" лучше сделать метод "double_value" в базовом). В-пятых, функции нахождения НОД и НОК не следует делать методами класса "fraction" (кстати, НОК мне даже не пригодилось).

Вот моё видение твоей задачи.
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include "xtl_math.h"
 
class fraction {
public:
    fraction () : m_numerator(0), m_denominator(1) {}
    fraction (int numerator, int denominator) : m_numerator(numerator), m_denominator(denominator) { fix(); }
    
    virtual ~fraction () {}
    
    // ---- Арифметика ----------------------------------------------------------------------------
    
    fraction operator + (const fraction & f) const {
        return fraction(m_numerator * f.m_denominator + m_denominator * f.m_numerator, m_denominator * f.m_denominator);
    }
    fraction operator - (const fraction & f) const {
        return fraction(m_numerator * f.m_denominator - m_denominator * f.m_numerator, m_denominator * f.m_denominator);
    }
    fraction operator * (const fraction & f) const {
        return fraction(m_numerator * f.m_numerator, m_denominator * f.m_denominator);
    }
    fraction operator / (const fraction & f) const {
        return fraction(m_numerator * f.m_denominator, m_denominator * f.m_numerator);
    }
    
    fraction operator += (const fraction & f) { return *this = *this + f; }
    fraction operator -= (const fraction & f) { return *this = *this - f; }
    fraction operator *= (const fraction & f) { return *this = *this * f; }
    fraction operator /= (const fraction & f) { return *this = *this / f; }
    
    fraction operator - () { return fraction(-m_numerator, m_denominator); }
    fraction operator + () { return fraction(*this); }
    
    // ---- Доступ --------------------------------------------------------------------------------
    
    double double_value () const { return static_cast<double>(m_numerator) / m_denominator; }
    
    // ---- Ввод-вывод ----------------------------------------------------------------------------
    
    friend std::ostream & operator << (std::ostream & stream, const fraction & fract) {
        if (fract.m_numerator == 0 && fract.m_denominator == 0) stream << "nan";
        else if (fract.m_denominator == 0) stream << "inf";
        else if (fract.m_numerator == 0) stream << "0";
        else if (fract.m_denominator == 1) stream << fract.m_numerator;
        else stream << fract.m_numerator << "/" << fract.m_denominator;
        
        return stream;
    }
    
private:
    void fix () {
        simplify();
        fix_sign();
    }
 
    void simplify () {
        int g_c_d = xtd::gcd(m_numerator, m_denominator);
        
        if (g_c_d != 0) {
            m_numerator /= g_c_d;
            m_denominator /= g_c_d;
        }
    }
    
    void fix_sign () {
        if (m_denominator < 0) {
            m_denominator *= -1;
            m_numerator *= -1;
        }
    }
 
protected:
    int m_numerator;
    int m_denominator;
};
 
class proper_fraction : public fraction {
public:
    proper_fraction () : fraction() {}
    proper_fraction (int n, int d) : fraction(n, d) {}
    
    // Здесь нужно только переопределить вывод.
    friend std::ostream & operator << (std::ostream & stream, const proper_fraction & fract);
};
 
int main (int argc, char * const argv[]) {  
    std::cout << fraction()     << std::endl; // 0
    std::cout << fraction(0, 0) << std::endl; // nan
    std::cout << fraction(1, 0) << std::endl; // inf
    std::cout << fraction(1, 2) << std::endl; // 1/2
    
    std::cout << fraction(3, 7).double_value() << std::endl; // 0.428571
 
    return 0;
}
кусок файла xtl_math.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef _XTL_MATH_H
#define _XTL_MATH_H
 
#include <algorithm>
 
namespace xtd {
 
//!     Наибольший общий делитель (greatest common divisor).
int gcd (int first, int second) {
    if (second == 0) std::swap(first, second);
 
    while (second != 0 && (first %= second)) std::swap(first, second);
    
    return abs(second);
}
 
}
 
#endif
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru