Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
160 / 152 / 92
Регистрация: 18.11.2015
Сообщений: 677
1

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

09.03.2016, 21:14. Показов 2370. Ответов 7
Метки нет (Все метки)

Привет, есть два класса 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;
};
Я еще не изучал указатели и хочу у вас спросить, как мне заставить эту программу работать без них(желательно)?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2016, 21:14
Ответы с готовыми решениями:

Передать данные одного обьекта класса в другой обьект на другой форме
Здравствуйте прочитал вот это https://www.cyberforum.ru/windows-forms/thread110436.html но так и...

Есть два класса. Как из одного класса перенести данные в другой класс?
Есть два класса : планета и диспетчер планет. Диспетчер имеет информацию о планетах: их названия,...

Как передать входящее значение одного метода класса на возврат в другой метод того же класса?
Я самый новейший новичок. Помогите.Как передать входящее значение (количество еды) метода feed...

Преобразование одного типа в другой
Привет. Проходил тему про преобразования одного типа в другой например это: static void Main()...

7
Модератор
Эксперт С++
11096 / 9145 / 5495
Регистрация: 18.12.2011
Сообщений: 24,436
09.03.2016, 21:26 2
Лучший ответ Сообщение было отмечено 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
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;
}
1
15114 / 8113 / 1959
Регистрация: 30.01.2014
Сообщений: 13,794
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 к функциям преобразования типов - т.к. они не меняют состояние объекта.
1
Модератор
Эксперт С++
11096 / 9145 / 5495
Регистрация: 18.12.2011
Сообщений: 24,436
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;
????????????????????????????
0
160 / 152 / 92
Регистрация: 18.11.2015
Сообщений: 677
09.03.2016, 21:35  [ТС] 5
Цитата Сообщение от zss Посмотреть сообщение
Сергей Сергеевич
Спасибо огромное!
А вы в строке 42 написали:
C++
1
USmoney RUSmoney::ConvertToUSmoney();
это значит, что это функция, которая возвращает USmoney в классе RUSmoney с названием ConvertToUSmoney? И без RUSmoney:: она работает так же?

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

Добавлено через 2 минуты
Цитата Сообщение от zss Посмотреть сообщение
А почему Вы это не хотите написать как
Чтобы остаток центов сохранить.
0
Модератор
Эксперт С++
11096 / 9145 / 5495
Регистрация: 18.12.2011
Сообщений: 24,436
09.03.2016, 21:38 6
Цитата Сообщение от meJevin Посмотреть сообщение
Чтобы остаток центов сохранить
C++
1
ostatok=cents%100;
0
15114 / 8113 / 1959
Регистрация: 30.01.2014
Сообщений: 13,794
09.03.2016, 21:39 7
meJevin, суть в том, что при взаимном использовании классами друг друга, нужно, чтобы реализации соответствующих функций (в данном случае функций преобразования) видели полное определение класса. Это как раз достигается в наших примерах переносом реализации из класса ниже, в точку, где полные определения видны.
1
Модератор
Эксперт С++
11096 / 9145 / 5495
Регистрация: 18.12.2011
Сообщений: 24,436
09.03.2016, 21:39 8
Цитата Сообщение от meJevin Посмотреть сообщение
без RUSmoney::
Это я при копировании забыл убрать. Потом исправил.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2016, 21:39

Преобразование из одного типа в другой
подскажите пожалуйста как преобразовать из tprotocolversion в string?)

Преобразование массива из одного типа в другой
Дан массив из 50 строк string line Как преобразовать его к типу инт

Преобразование массива одного типа в другой
Есть массив int-овых чисел. Нужно его перевести в массив double. Поэлементно с помощью цикла очень...

Преобразование одного массива данных в другой
Как сделать преобразование одного массива данных в CSV файлах? Пример считываем 12 столбец файла (в...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.