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

Абстрактный класс чисел - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Рекурсия в различных компиляторах http://www.cyberforum.ru/cpp-beginners/thread336725.html
Доброго времени суток. Задача: дано целое число n, нужно получить его битовое представление, развернуть его, и то, что получилось перевести обратно в десятичную систему счисления. Пример:n = 4, ответ - 1 n = 6, ответ - 3. Решил ее через циклы, прошла все тесты, поэтому решение меня не интересует. Также написал красивую на мой взгляд рекурсию, которая отлично работает на gcc. #include...
C++ Ввод данных В общем есть переменная int year; Юзер должен ввести значение переменной, но мне нужно чтобы он мог ввести максимум четырехзначное число, тоесть как бы ограничить количество вводимых символов http://www.cyberforum.ru/cpp-beginners/thread336682.html
Графы C++
Прочитал про обход графа в глубину, посмотрел реализацию, и тут вопрос а как можно использовать этот обход в глубину?
Матрица Изменение C++
Здравствуйте! Просьба такая: "Приведите пожалуйста пример как можно расширять границы матрицы". Например из матрицы 3х3 сделать матрицу 3х4 и новый столбец добавленный сразуже обнулить. Я думаю что с помощью replace но опять такие нужен пример с хорошими пояснениями.
C++ взять адрес переменной http://www.cyberforum.ru/cpp-beginners/thread336660.html
если & стоит перед переменной, то это читается как - " взять адрес этой переменной" а если он стоит после ?
C++ Инжект кода Здраствуйте... Пишу простый инжектор кода в процесс(win32). Использую CreateRemoteThread. Внедряю код функции которая должна запустится в новом потоке удаленного процесса. Все вроде норм. но у меня траблы с WriteProcessMemory. вот кусок кода си++: int main (void) { подробнее

Показать сообщение отдельно
Ale-X91
2 / 2 / 0
Регистрация: 27.07.2011
Сообщений: 12
28.07.2011, 14:55  [ТС]     Абстрактный класс чисел
Я сейчас внес небольшие изменения: перегрузил сложение, поменял метод sum (теперь он возвращает ссылку на временный объект). Но когда этот временный объект удалять? И как сделать присваивание?

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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <iostream>
#include <string>
#include <math.h>
const double EPS = 1e-4;
using namespace std;
 
void divide(_int64 &a, _int64 &b){
    _int64 i = 2;
    do
        if(a%i == 0 && b%i == 0){
            a /= i;
            b /= i;
        }
        else
            i++;
    while(i <= a && i <= b);
};
 
class Number{
public:
    virtual ostream& print(ostream& st) const = 0;
    virtual Number& sum(Number& a) = 0;
};
 
class Fraction: public Number{
private:
    int chisl, znam;
public:
    Fraction(int a = 0, int b = 1);
    double get_value() {return 1.0*chisl/znam;};
    ostream& print(ostream& st) const ;
    Number& sum(Number& a);
};
Fraction::Fraction(int a, int b){
    _int64 a2 = a*abs(b)/b;
    _int64 b2 = abs(b);
 
    divide(a2, b2);
 
    chisl = a2;
    znam = b2;
};
ostream& Fraction::print(ostream &st) const {
    return (st << chisl << "/" << znam);
};
Number& Fraction::sum(Number& a){
    Number* temp = new Fraction(); // Временный объект. Возвращается ссылка на него
    Fraction arg = (Fraction&) a; //Аргумент
    
    _int64 com_znam = znam * arg.znam;//Общий знаменатель
    _int64 res_chisl = chisl*arg.znam + arg.chisl*znam;//Числитель результата
    divide(res_chisl, com_znam); //Сокращение дроби
 
    ((Fraction*)temp)->chisl = res_chisl;
    ((Fraction*)temp)->znam = com_znam;
 
    return *temp;
};
 
class Complex: public Number{
private:
    double Re, Im;
public:
    Complex(double a = 0, double b = 0): Re(a), Im(b) {};
    double get_real() {return Re;};
    double get_im() {return Im;};
    ostream& print(ostream& st) const ;
    Number& sum(Number& a);
};
ostream& Complex::print(ostream &st) const {
    if(abs(Re) >= EPS){
        st << Re;
        double Im_abs = abs(Im);
        if(Im_abs >= EPS){
            if(Im > 0)
                st << "+";
            else
                st << "-";
            if(abs(Im_abs -1) >= EPS)
                st << Im_abs;
            st << "i";
        }
    }
    else
        st << Im << "i";
    return st;
};
 
Number& Complex::sum(Number& a){
    Number* temp = new Complex();
    ((Complex*)temp)->Re = this->Re + ((Complex&) a).Re;
    ((Complex*)temp)->Im = this->Im + ((Complex&) a).Im;
    return *temp;
}
 
inline ostream& operator << (ostream& st, const Number& val){
    return val.print(st);
};
 
inline Number& operator+(Number& a, Number& b){
    return a.sum(b);
};
int main(){
    Number* ac = new Complex(-10, 2.5);
    Number* bc = new Complex(18, -6.5);
 
    Number& res_c = ac->sum(*bc);
    cout << res_c << endl;
 
    Complex val1(12, 13);
    Complex val2(5, 6);
    cout << val1 + val2 << endl;
 
    cin.get();
    return 0;
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru