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

Преобразование из одного класса в другой - C++

Восстановить пароль Регистрация
 
meJevin
 Аватар для meJevin
153 / 145 / 56
Регистрация: 18.11.2015
Сообщений: 600
Завершенные тесты: 1
09.03.2016, 21:14     Преобразование из одного класса в другой #1
Привет, есть два класса RUSmoney и USmoney. Там я сделал конвертирование из RUSmoney в USmoney и наоборот (строки 41 и 75)
Вот код:
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 <conio.h>
#include <iomanip>
#include <limits>
 
template<typename Type>
void cinNum(Type& var, char* text) {
 
    int intLimit = std::numeric_limits<int>::max();
 
    std::cout << text;
    while (!(std::cin >> var) || (std::cin.peek() != '\n')) {
        std::cin.clear();
        std::cin.ignore(intLimit, '\n');
        std::cout << text;
    }
 
}
 
class RUSmoney {
private:
    unsigned int rubles;
    unsigned int kopeks;
 
public:
    RUSmoney(unsigned int rubles = 0, unsigned int kopeks = 0) {
        if (kopeks < 0)
            kopeks = 0;
        if (rubles < 0)
            rubles = 0;
 
        this->rubles = rubles;
        this->kopeks = kopeks;
    }
 
    void print() {
        std::cout << "Your RUS money: ";
        std::cout << rubles << " Rubles, " << kopeks << " Kopeks\n\n";
    }
 
    operator USmoney() {
        unsigned int dollars = 0;
        unsigned int cents = (rubles * 1.4) + (kopeks * 0.014);
 
        while (cents >= 100) {
            cents -= 100;
            dollars += 1;
        }
 
        return USmoney(dollars, cents);
    }
};
 
class USmoney {
private:
    unsigned int dollars;
    unsigned int cents;
 
public:
    USmoney(unsigned int dollars = 0, unsigned int cents = 0) {
        if (cents < 0)
            cents = 0;
        if (dollars < 0)
            dollars = 0;
 
        this->dollars = dollars;
        this->cents = cents;
    }
 
    void print() {
        std::cout << "Your US money: ";
        std::cout << dollars << " Dollars, " << cents << " Cents\n\n";
    }
 
    operator RUSmoney() {
        unsigned int rubles = 0;
        unsigned int kopeks = (dollars * 7100) + (cents * 71);
 
        while (kopeks >= 100) {
            kopeks -= 100;
            rubles += 1;
        }
 
        return RUSmoney(rubles, kopeks);
    }
};
 
int main() {
 
    setlocale(LC_ALL, "RUSSIAN");
 
    unsigned int dollars, cents;
    unsigned int rubles, kopeks;
 
    cinNum(dollars, "Enter dollars: ");
    cinNum(cents, "Enter cents: ");
    cinNum(rubles, "Enter rubles: ");
    cinNum(kopeks, "Enter kopeks: ");
 
    USmoney moneyUS(dollars, cents);
    USmoney moneyUS_temp(dollars, cents);
    RUSmoney moneyRUS(rubles, kopeks);
 
    moneyUS.print();
    moneyRUS.print();
 
    std::cout << "US currency converted to RUS currency\n";
    moneyUS = moneyRUS;
    moneyUS.print();
    std::cout << "RUS currency converted to US currency\n";
    moneyRUS = moneyUS_temp;
    moneyRUS.print();
 
    _getch();
    return 0;
}
Но он не работает, пишет, что не знает, что такое USmoney. Я нашел на stack overflow, что можно делать прототипы классов, но при их использовании они должны быть указателями, типа так:
C++
1
2
3
4
5
6
7
8
9
10
11
class Foo;
 
class Bar {
public:
    Foo *myFoo; // This has to be a pointer, thanks for catching this!
};
 
class Foo {
public:
    int value;
};
Я еще не изучал указатели и хочу у вас спросить, как мне заставить эту программу работать без них(желательно)?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,167
Завершенные тесты: 1
09.03.2016, 21:26     Преобразование из одного класса в другой #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
117
118
119
120
#include <iostream>
#include <conio.h>
#include <iomanip>
#include <limits>
 
template<typename Type>
void cinNum(Type& var, char* text) {
 
    int intLimit = std::numeric_limits<int>::max();
 
    std::cout << text;
    while (!(std::cin >> var) || (std::cin.peek() != '\n')) {
        std::cin.clear();
        std::cin.ignore(intLimit, '\n');
        std::cout << text;
    }
 
}
class USmoney;
 
class RUSmoney {
private:
    unsigned int rubles;
    unsigned int kopeks;
 
public:
    RUSmoney(unsigned int rubles = 0, unsigned int kopeks = 0) {
        if (kopeks < 0)
            kopeks = 0;
        if (rubles < 0)
            rubles = 0;
 
        this->rubles = rubles;
        this->kopeks = kopeks;
    }
 
    void print() {
        std::cout << "Your RUS money: ";
        std::cout << rubles << " Rubles, " << kopeks << " Kopeks\n\n";
    }
    USmoney ConvertToUSmoney();
 
};
 
class USmoney {
private:
    unsigned int dollars;
    unsigned int cents;
 
public:
    USmoney(unsigned int dollars = 0, unsigned int cents = 0) {
        if (cents < 0)
            cents = 0;
        if (dollars < 0)
            dollars = 0;
 
        this->dollars = dollars;
        this->cents = cents;
    }
 
    void print() {
        std::cout << "Your US money: ";
        std::cout << dollars << " Dollars, " << cents << " Cents\n\n";
    }
 
    RUSmoney ConverToRUSmoney() {
        unsigned int rubles = 0;
        unsigned int kopeks = (dollars * 7100) + (cents * 71);
 
        while (kopeks >= 100) {
            kopeks -= 100;
            rubles += 1;
        }
 
        return RUSmoney(rubles, kopeks);
    }
};
 
USmoney RUSmoney::ConvertToUSmoney()
{
    unsigned int dollars = 0;
    unsigned int cents = int((rubles * 1.4) + (kopeks * 0.014));
 
    while (cents >= 100) {
        cents -= 100;
        dollars += 1;
    }
 
    return USmoney(dollars, cents);
}
 
int main() {
 
    setlocale(LC_ALL, "RUSSIAN");
 
    unsigned int dollars, cents;
    unsigned int rubles, kopeks;
 
    cinNum(dollars, "Enter dollars: ");
    cinNum(cents, "Enter cents: ");
    cinNum(rubles, "Enter rubles: ");
    cinNum(kopeks, "Enter kopeks: ");
 
    USmoney moneyUS(dollars, cents);
    USmoney moneyUS_temp(dollars, cents);
    RUSmoney moneyRUS(rubles, kopeks);
 
    moneyUS.print();
    moneyRUS.print();
 
    std::cout << "US currency converted to RUS currency\n";
    moneyUS = moneyRUS.ConvertToUSmoney();
    moneyUS.print();
    std::cout << "RUS currency converted to US currency\n";
    moneyRUS = moneyUS_temp.ConverToRUSmoney();
    moneyRUS.print();
 
    _getch();
    return 0;
}
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
09.03.2016, 21:30     Преобразование из одного класса в другой #3
Цитата Сообщение от meJevin Посмотреть сообщение
как мне заставить эту программу работать
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <iomanip>
#include <limits>
 
template<typename Type>
void cinNum(Type& var, char const * text) {
 
    int intLimit = std::numeric_limits<int>::max();
 
    std::cout << text;
    while (!(std::cin >> var) || (std::cin.peek() != '\n')) {
        std::cin.clear();
        std::cin.ignore(intLimit, '\n');
        std::cout << text;
    }
 
}
 
class USmoney;
 
class RUSmoney {
private:
    unsigned int rubles;
    unsigned int kopeks;
 
public:
    RUSmoney(unsigned int rubles = 0, unsigned int kopeks = 0)
        : rubles(rubles), kopeks(kopeks)
    {
    }
 
    void print() {
        std::cout << "Your RUS money: ";
        std::cout << rubles << " Rubles, " << kopeks << " Kopeks\n\n";
    }
 
    operator USmoney() const;
};
 
class USmoney {
private:
    unsigned int dollars;
    unsigned int cents;
 
public:
    USmoney(unsigned int dollars = 0, unsigned int cents = 0)
        : dollars(dollars), cents(cents)
    { }
 
    void print() {
        std::cout << "Your US money: ";
        std::cout << dollars << " Dollars, " << cents << " Cents\n\n";
    }
 
    operator RUSmoney() const;
};
 
RUSmoney::operator USmoney() const {
    unsigned int dollars = 0;
    unsigned int cents = (rubles * 1.4) + (kopeks * 0.014);
 
    while (cents >= 100) {
        cents -= 100;
        dollars += 1;
    }
 
    return USmoney(dollars, cents);
}
 
USmoney::operator RUSmoney() const {
    unsigned int rubles = 0;
    unsigned int kopeks = (dollars * 7100) + (cents * 71);
 
    while (kopeks >= 100) {
        kopeks -= 100;
        rubles += 1;
    }
 
    return RUSmoney(rubles, kopeks);
}
 
int main() {
 
    setlocale(LC_ALL, "RUSSIAN");
 
    unsigned int dollars, cents;
    unsigned int rubles, kopeks;
 
    cinNum(dollars, "Enter dollars: ");
    cinNum(cents, "Enter cents: ");
    cinNum(rubles, "Enter rubles: ");
    cinNum(kopeks, "Enter kopeks: ");
 
    USmoney moneyUS(dollars, cents);
    USmoney moneyUS_temp(dollars, cents);
    RUSmoney moneyRUS(rubles, kopeks);
 
    moneyUS.print();
    moneyRUS.print();
 
    std::cout << "US currency converted to RUS currency\n";
    moneyUS = moneyRUS;
    moneyUS.print();
    std::cout << "RUS currency converted to US currency\n";
    moneyRUS = moneyUS_temp;
    moneyRUS.print();
 
    return 0;
}

+ убрал бессмысленные проверки на отрицательные значения у unsigned переменных, заменил присваивание на инициализацию в конструкторе (приучаться к правильному нужно сразу) и добавил const к функциям преобразования типов - т.к. они не меняют состояние объекта.
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,167
Завершенные тесты: 1
09.03.2016, 21:30     Преобразование из одного класса в другой #4
Цитата Сообщение от meJevin Посмотреть сообщение
C++
1
2
3
4
5
while (cents >= 100)
 { 
    cents -= 100; 
    dollars += 1;
}
А почему Вы это не хотите написать как
C++
1
dollars=cents/100;
????????????????????????????
meJevin
 Аватар для meJevin
153 / 145 / 56
Регистрация: 18.11.2015
Сообщений: 600
Завершенные тесты: 1
09.03.2016, 21:35  [ТС]     Преобразование из одного класса в другой #5
Цитата Сообщение от zss Посмотреть сообщение
Сергей Сергеевич
Спасибо огромное!
А вы в строке 42 написали:
C++
1
USmoney RUSmoney::ConvertToUSmoney();
это значит, что это функция, которая возвращает USmoney в классе RUSmoney с названием ConvertToUSmoney? И без RUSmoney:: она работает так же?

Добавлено через 44 секунды
Цитата Сообщение от DrOffset Посмотреть сообщение
+ убрал бессмысленные проверки на отрицательные значения у unsigned
Да, я это сам потом заметил

Добавлено через 2 минуты
Цитата Сообщение от zss Посмотреть сообщение
А почему Вы это не хотите написать как
Чтобы остаток центов сохранить.
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,167
Завершенные тесты: 1
09.03.2016, 21:38     Преобразование из одного класса в другой #6
Цитата Сообщение от meJevin Посмотреть сообщение
Чтобы остаток центов сохранить
C++
1
ostatok=cents%100;
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
09.03.2016, 21:39     Преобразование из одного класса в другой #7
meJevin, суть в том, что при взаимном использовании классами друг друга, нужно, чтобы реализации соответствующих функций (в данном случае функций преобразования) видели полное определение класса. Это как раз достигается в наших примерах переносом реализации из класса ниже, в точку, где полные определения видны.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2016, 21:39     Преобразование из одного класса в другой
Еще ссылки по теме:

C++ Преобразование массива одного типа в другой
Передача массива одного класса в другой С++ C++
C++ Преобразование одного массива данных в другой

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,167
Завершенные тесты: 1
09.03.2016, 21:39     Преобразование из одного класса в другой #8
Цитата Сообщение от meJevin Посмотреть сообщение
без RUSmoney::
Это я при копировании забыл убрать. Потом исправил.
Yandex
Объявления
09.03.2016, 21:39     Преобразование из одного класса в другой
Ответ Создать тему
Опции темы

Текущее время: 07:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru