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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
cheser
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 42
#1

VS ругается на ошибки - C++

03.05.2012, 13:53. Просмотров 535. Ответов 12
Метки нет (Все метки)

вот программа:
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
121
122
123
124
125
126
127
128
129
130
131
132
// money 1.0.0.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "locale"
#include "iostream"
#include "string.h"
#include "windows.h"
#include "map"
 
using namespace std;
 
// --------------------------------------------------------------------------------
// Валюты необходимые для задачи
enum currencies
{
    KZT,
    RUR,
    USD,
    EUR
};
 
// --------------------------------------------------------------------------------
// Класс-деньги
class money
{
public:
    // Конструкторы
    money(double summa = 0.0, currencies currency = KZT);
    money(unsigned int int_part, unsigned char fract_part, currencies currency = KZT);
        // Тип валюты
    currencies getCurrency();
    //Ввод валюты
    currencies setCurrency();
    // Целая часть суммы
    unsigned int _int_part;
    // Дробная часть суммы (тиыны, копейки и т.д.)
    unsigned char _fract_part;
    // Тип валюты
   currencies _currency;
    unsigned long long smallChange() const;
};
 
// --------------------------------------------------------------------------------
// Класс-Обменник - наследование
class exchanger
{
public:
    // Меняет одну валюту на другую
    static money exchange(const money& summa, currencies currency);
    // Курсы обмена
    static map<currencies, double> rates;
};
 
// --------------------------------------------------------------------------------
// Инициализирует статический член обменного класса
typedef pair<currencies, double> rate_pair;
rate_pair rates_arr[4] = 
{
    rate_pair(KZT, 1.0), 
    rate_pair(RUR, 5.1), 
    rate_pair(USD, 147.5), 
    rate_pair(EUR, 184.7)
};
map<currencies, double> exchanger::rates(rates_arr, rates_arr + sizeof (rates_arr) / sizeof (rate_pair));
 
// --------------------------------------------------------------------------------
// Для вывода типа валюты используется следующие имена
typedef pair<currencies, wstring> currency_name_pair;
currency_name_pair currencies_names_arr[4] = 
{ 
    currency_name_pair(KZT, L"KZT"), 
    currency_name_pair(RUR, L"RUR"), 
    currency_name_pair(USD, L"USD"), 
    currency_name_pair(EUR, L"EUR")
};
map<currencies, wstring> currency_names(currencies_names_arr, currencies_names_arr + sizeof (currencies_names_arr) / sizeof (currency_name_pair));
 
// --------------------------------------------------------------------------------
//
int main()
{
    setlocale(LC_ALL, "Russian");
    cout<<" \n";
    system("pause");
}
 
money::money(double summa, currencies currency) throw (invalid_argument)
{
    if (summa < 0)
    {
        throw invalid_argument("Сумма не может быть отрицательной");
    }
    _int_part = static_cast<unsigned int> (summa);
    _fract_part = static_cast<unsigned char> ((summa - _int_part)*100);
    _currency = currency;
}
 
money::money(unsigned int int_part, unsigned char fract_part, currencies currency)
{
    if (fract_part > 99)
    {
        throw invalid_argument("Количество мелочи не может быть больше 99");
    }
    _int_part = int_part;
    _fract_part = fract_part;
    _currency = currency;
}
 
currencies money::getCurrency(currencies currency)
{
    return currency;
}
 
int money::setCurrency(currencies currency)
{
    _currency = currency;
}
 
inline unsigned long long money::smallChange() const
{
    return _int_part * 100ULL + _fract_part;
}
 
money exchanger::exchange(const money& summa, currencies currency)
{
    double rate = rates[summa._currency] / rates[currency];
    money result = summa*rate;
    result.currency = currency;
    return result;
}
указал все в классе, а он ругается такими ошибками:
1>c:\users\zufar\documents\visual studio 2008\projects\money 1.0.0\money 1.0.0\money 1.0.0.cpp(89) : warning C4290: спецификация исключений C++ игнорируется, кроме случая, когда указывается, что функция не является __declspec(nothrow)
1>c:\users\zufar\documents\visual studio 2008\projects\money 1.0.0\money 1.0.0\money 1.0.0.cpp(112) : error C2511: currencies money::getCurrency(currencies): перегруженная функция-член не найдена в 'money'
1> c:\users\zufar\documents\visual studio 2008\projects\money 1.0.0\money 1.0.0\money 1.0.0.cpp(27): см. объявление 'money'
1>c:\users\zufar\documents\visual studio 2008\projects\money 1.0.0\money 1.0.0\money 1.0.0.cpp(117) : error C2511: int money::setCurrency(currencies): перегруженная функция-член не найдена в 'money'
1> c:\users\zufar\documents\visual studio 2008\projects\money 1.0.0\money 1.0.0\money 1.0.0.cpp(27): см. объявление 'money'
1>c:\users\zufar\documents\visual studio 2008\projects\money 1.0.0\money 1.0.0\money 1.0.0.cpp(129) : error C2676: бинарный '*': 'const money' не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
1>c:\users\zufar\documents\visual studio 2008\projects\money 1.0.0\money 1.0.0\money 1.0.0.cpp(130) : error C2039: currency: не является членом "money"
1> c:\users\zufar\documents\visual studio 2008\projects\money 1.0.0\money 1.0.0\money 1.0.0.cpp(27): см. объявление 'money'
в чем мой косяк?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2012, 13:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос VS ругается на ошибки (C++):

Найти ошибки в коде и исправить эти ошибки (Наследование) - C++
Вот в общем 3 файла, изучаю наследование на примере односвязного и двусвязного списков: list.h (inline) #pragma once class list...

Почему vk ругается на бесплатные хостинги? На какие не ругается? - Бесплатный хостинг
Здравствуйте, Что нужно сделать, чтобы vk не ругался на бесплатный хостинг? Я нашёл отличный хостинг 5gbfree.com. Я на нём храню свои...

Найти ошибки в данной программе (известно что есть только 2 ошибки) - Assembler
У меня в модуле с програмирования задание: Найти ошибки в данной программе (известно что есть только 2 ошибки) .model small .data ...

Ошибки после компиляции на Visual Express 2012.Ошибки в теме - Visual C++
Добрый вечер ребят помогите пожалуйста.Программа написана на Visual Express 2012.Обясните что поменять чтобы зароботало. После компиляции...

Inet Explorer при обнаружении ошибки вместо описания ошибки выдает иероглифы - C# ASP.NET
Начал изучение ASP. Inet Explorer при обнаружении ошибки вместо описания ошибки выдает иероглифы... А мне ОЧЕНЬ хотелось бы почитать, что...

Windows XP на HP compaqt 6220 ошибки при установке, как убить эти ошибки - Windows XP
Всех приветствую уважаемые Комрады ,форумчане не проходите мимо помогите откликнитесь мучаюсь уже с месяц попробывал всё что можно ...

12
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
03.05.2012, 14:03 #2
у вас функции в классе объявлены без параметров:
C++
1
2
3
4
currencies getCurrency();
    //Ввод валюты
currencies setCurrency();
    // Целая часть суммы
а определяете вы их уже с параметами
C++
1
2
3
4
5
6
currencies money::getCurrency(currencies currency) 
{
}
int money::setCurrency(currencies currency)
{
}
Добавлено через 2 минуты
Цитата Сообщение от cheser Посмотреть сообщение
1>c:\users\zufar\documents\visual studio 2008\projects\money 1.0.0\money 1.0.0\money 1.0.0.cpp(129) : error C2676: бинарный '*': 'const money' не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
Цитата Сообщение от cheser Посмотреть сообщение
money result = summa*rate;
надо перегружать оператор умножения.
0
cheser
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 42
03.05.2012, 14:05  [ТС] #3
то есть мне надо будет просто сделать так: указать в функциях параметры "currencies currency", а в методах их не указывать?

а "*" это ссылка как и "&"
0
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
03.05.2012, 14:05 #4
Цитата Сообщение от cheser Посмотреть сообщение
1>c:\users\zufar\documents\visual studio 2008\projects\money 1.0.0\money 1.0.0\money 1.0.0.cpp(130) : error C2039: currency: не является членом "money"
Цитата Сообщение от cheser Посмотреть сообщение
result.currency = currency;
Здесь вы уже сами запутались в своих обозначениях) в классе у вас есть переменная с именем _currency
0
cheser
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 42
03.05.2012, 14:09  [ТС] #5
Цитата Сообщение от antoha398 Посмотреть сообщение
Здесь вы уже сами запутались в своих обозначениях) в классе у вас есть переменная с именем _currency
C++
1
result.currency = _currency;
error C2065: _currency: необъявленный идентификатор
0
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
03.05.2012, 14:10 #6
Цитата Сообщение от cheser Посмотреть сообщение
то есть мне надо будет просто сделать так: указать в функциях параметры "currencies currency", а в методах их не указывать?
если у вас нет цели перегружать эту функцию то объявление должно совпадать с определением:
C++
1
2
3
4
5
6
7
8
// объявление в классе
setCurrency(currencies currency);
 
//определение этой функции
int money::setCurrency(currencies currency)
{
/* трололо */
}
ну максимум можно объявить без имени переменной
C++
1
setCurrency(currencies);
Добавлено через 1 минуту
Цитата Сообщение от cheser Посмотреть сообщение
result.currency = _currency;
C++
1
result._currency = currency;
1
cheser
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 42
03.05.2012, 14:20  [ТС] #7
C++
1
2
3
4
5
6
7
8
9
currencies money::getCurrency(currencies currency)
{
    return currency;
}
 
currencies money::setCurrency(currencies currency)
{
    _currency = currency;
}
сделал так и в классе указал "currencies currency" не ругается)

а вот по теме:
C++
1
money result = summa*rate;
он жестко меня троллит замени "*" на "&" эффект тот же
1>c:\users\zufar\documents\visual studio 2008\projects\money 1.0.0\money 1.0.0\money 1.0.0.cpp(129) : error C2676: бинарный '&': 'const money' не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
0
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
03.05.2012, 14:26 #8
money result = summa*rate

он жестко меня троллит замени "*" на "&" эффект тот же
вы тут умножаете.. при чем тут операторы взятия адреса и разыменования?

вам в классе надо перегрузить оператор умножения operator*
0
cheser
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 42
03.05.2012, 14:28  [ТС] #9
Цитата Сообщение от antoha398 Посмотреть сообщение
вы тут умножаете.. при чем тут операторы взятия адреса и разыменования?

вам в классе надо перегрузить оператор умножения operator*
уже гоню
0
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
03.05.2012, 14:36 #10
C++
1
2
3
4
currencies money::setCurrency(currencies currency)
{
    _currency = currency;
}
если вы этой функции только присваиваете значение, лучше ее сделать типом void

Добавлено через 7 минут
Цитата Сообщение от cheser Посмотреть сообщение
money result = summa*rate;
для этого напишите лучше отдельную фукцию-член класса.
1
cheser
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 42
03.05.2012, 14:59  [ТС] #11
Цитата Сообщение от antoha398 Посмотреть сообщение
для этого напишите лучше отдельную фукцию-член класса.
спасибо с этим разберусь, а в плане ввода значения где лучше писать?
0
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
03.05.2012, 15:10 #12
Цитата Сообщение от cheser Посмотреть сообщение
а в плане ввода значения где лучше писать?
ввод каких значений?
инициализация переменных типа money, например?
C++
1
2
money rub;
cin >> rub
в этом случае надо перегружать оператор ввод >>
0
cheser
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 42
03.05.2012, 15:17  [ТС] #13
Цитата Сообщение от antoha398 Посмотреть сообщение
ввод каких значений?
изначально же у меня в классе "money"
C++
1
2
money(double summa = 0.0, currencies currency = KZT);
money(unsigned int int_part, unsigned char fract_part, currencies currency = KZT);
буде вводить числовое значение к примеру 300.0 а он сразу должен его обработать как 300.0 KZT
KZT (тенге )
0
03.05.2012, 15:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2012, 15:17
Привет! Вот еще темы с ответами:

Не удалось инициализировать SAM из-за следующей ошибки: Присоединенное к системе устройство не работает. Состояние ошибки: 0xc0000001 - Windows XP
Добрый день форумчане. На работе одна женщина после месяца отпуска напрочь забыла пароль от своей учетной записи (она сидела на...

Ошибки при компиляции - исправить ошибки в коде - C (СИ)
Помогите исправить ошибки , не понимаю в чем может быть причина ... #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; ...

Найти ошибки в коде и исправить эти ошибки - C++
Есть у меня вот такой код: #include &lt;iostream&gt; using namespace std; class A{ private: int* a; size_t size_; ...

Найти ошибки в коде и исправить эти ошибки - C++ - C++
Судя по вываливающейся ошибки, идет двойное освобождение памяти. У самого не получается отловить откуда. A.h #pragma once ...


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

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

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