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

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

Войти
Регистрация
Восстановить пароль
 
VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
#1

Неявное преобразование типа - C++

29.03.2012, 15:02. Просмотров 878. Ответов 6
Метки нет (Все метки)

Привет. Решаю задачу, не могу решить проблему.

Есть класс 'time' и производный от него класс 'interval'.
1 - содержит поля h, m, s, основные методы работы, конвертации и т.п.
2 - наследует все поля класса 'time'.
Принцип работы такой. Заполняем 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
class time {
protected:
    int hour,
                 minute,
                 second;
    int all;
    int part;
    bool clock_system; // true - 24, false - 12
public:
    // methods
    void input_f1();
    void output_f1();
    void show_f1();
    void convert_to_f1();
    
    void input_f2();
    void output_f2();
    void show_f2();
    void convert_to_f2();
 
    bool get_format();
    int get_all();
 
 
};
 
 
class Interval: public time {
    // methods
public:
    void find(time left, time right);
};
Функция, которая ищет сам промежуток.
C++
1
2
3
4
5
6
void Interval::find(time left, time right) {
    all = abs(left.get_all()-right.get_all());
    hour = all/3600;
    minute = all%hour;
    second = all%60;
}
Программа посчитает hour, но на minute запорется (просто выдаст сообщение о невозможности продолж. работы программы предложит отправлять или не отправлять отчет). Как решить? Я считаю что это проблема с типами.

Изначально h, m, s определил как unsigned int, переменная all должна быть long int (условие задачи), вчера нифига не заработало все переписал под int, все равно zero. Может со стороны увидите?

В теории все должно работать на этих 4-5 строках:
C++
1
2
3
4
5
6
7
8
9
10
int main() {
    time l, r; // объяв. объекты класса время
    Interval o; // объяв. объект класса интервал времкени
    
    l.input_f2(); // ввели первый момент
    r.input_f2(); // ввели второй момент
 
    o.find(l, r); // нашли интервал между моментам
    o.output_f2(); // вывели интервал
}
Программа останавливается в ф-ии find на 4 строке.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2012, 15:02     Неявное преобразование типа
Посмотрите здесь:

C++ Как запретить компилятору неявное преобразование из числового типа в символьный?
Неявное преобразование переменных C++
Преобразование типа C++
C++ Не работает явное преобразование типа, а неявное работает.
C++ Неявное преобразование типов
C++ Неявное преобразование типа данных через структуры
C++ Объясните неявное преобразование в этом случае
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
29.03.2012, 15:31     Неявное преобразование типа #2
Цитата Сообщение от VladSharikov Посмотреть сообщение
высчитываем разницу между двумя моментами времени (переводим все в секунды, вычитаем по модулю), переводим обратно в часы, минуты, секунды и присваиваем их полям класса интервал.
Зачем так? Можно же просто вычесть из часов часы, из минут минуты, а из секунд секунды по модулю. Зачем несколько раз всё переводить?
Вам просто нужно дописать геттеры для часов, минут и секунд
C++
1
2
3
int getHour() const {return hour;}
int getMin() const {return minute;}
int getSec() const {return seconds;}
Вычитайте по модулю и возвращайте новый объект time
VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
29.03.2012, 15:39  [ТС]     Неявное преобразование типа #3
думал, это получится 100%, но зачем тогда вообще переменная, содержащая общее время в секундах? это условие задачи, я быть может написать забыл
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
29.03.2012, 15:50     Неявное преобразование типа #4
Цитата Сообщение от VladSharikov Посмотреть сообщение
но зачем тогда вообще переменная, содержащая общее время в секундах? это условие задачи, я быть может написать забыл
Напишите условие задачи

Ну просто не логично переводит всё в сукунды, затем вычитать, а потом всё обратно переводить))
Даже если по заданию, то эта переменная нужна точно не для подсчётов.
VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
29.03.2012, 15:57  [ТС]     Неявное преобразование типа #5
Поправил - ни с того ни с сего появилась ошибка

Error spawning 'mt.exe

Я понимаю это не из-за вашего кода

идеи есть?

Добавлено через 3 минуты
1) Класс «время». Класс должен содержать такие поля как часы, минуты, секунды и время, выраженное длинным целым числом (время, переведенное в секунды); методы: ввод времени в заданном формате, вывод времени в заданном формате, преобразование между форматами.

2) Класс «интервал времени». Класс должен позволять оперировать с двумя значениями времени – начальным и конечным; позволять определять временные интервалы в часах, минутах, секундах; находить начальное время, если известно конечное и интервал; определять конечное время, если известно начальное и интервал; определять интервал времени между начальным и конечным и выводить его в разных форматах.
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
29.03.2012, 17:26     Неявное преобразование типа #6
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
#include "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std;
using std::ostream;
 
class time
{
protected:
    int hours;
    int minutes;
    int seconds;
    double inSeconds;
    bool part;
    bool system; // true - 24; false - 12
public:
    time(){};
    time(int, int, int, bool);
    
    int getH() const{return hours;}
    int getM() const{return minutes;}
    int getS() const{return seconds;}
    bool getSys() const{return system;}
    double getInSeconds() const{ return inSeconds;}
    friend ostream& operator<<(ostream&, const time&);
    
    void convert();
};
 
ostream& operator<<(ostream& cout_, const time& obj)
{
    cout_ << obj.hours<<":"<<obj.minutes<<":"<<obj.seconds;
    if(!obj.system)
        if(obj.part==true)
            cout_ << " AM";
        else
            cout_ << " PM";
    return cout_;
}
 
time::time(int h, int m, int s, bool sys)
{
    h = h%24;
    inSeconds = h * 3600 + m * 60 + s;
    if(sys == false)
    {
        h = h%12;
        if(h >= 12)
            part = true;
        else
            part = false;
    }
    hours = h;
    minutes = m%60;
    seconds = s%60;
    system = sys;
}
 
void time::convert()
{
    if(system) //24
    {
        hours>=12 ? part=true : part = false;
        hours = hours%12;
    }
    else //12
    {
        part==true;
        hours = 12+hours;
    }
    system = system^1;
}
 
class interval: public time
{
public:
    interval(const time,const time);
    friend ostream& operator<<(ostream&, const interval&);
};
 
interval::interval(time l, time r): time()
{
    hours = abs(l.getH() - r.getH());
    minutes = abs(l.getM() - r.getM());
    seconds = abs(l.getS() - r.getS());
}
 
ostream& operator<<(ostream& cout_, const interval& obj)
{
    cout_ << obj.hours<<":"<<obj.minutes<<":"<<obj.seconds;
    return cout_;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    time t(16,15,15,1);
    cout<<t<<endl;
    t.convert();
    cout<<t<<endl;
    time t2(15,14,14,1);
    interval i(t,t2);
    cout<<i;
    system("pause");
    return 0;
}
Доработайте!
Есть такая проблема как метод convert, он наследуется. А конвертировать в интервале нечего. Нужно написать либо отдельный класс, который будет конвертить, либо как то наверное без наследования обойтись. + double inSeconds; bool part; bool system; - не нужны для class interval.

Может кто-то подскажет кроме меня как лучше сделать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2012, 17:42     Неявное преобразование типа
Еще ссылки по теме:

C++ Неявное преобразование типов?
Внутреннее устройство многомерного массива и неявное преобразование массива в указатель C++
Продемонстровать неявное преобразование типов: из целого в вещественный и обратно C++
C++ Неявное преобразование типов
Неявное восходящее преобразование при защищенном/закрытом наследовании C++

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

Или воспользуйтесь поиском по форуму:
VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
29.03.2012, 17:42  [ТС]     Неявное преобразование типа #7
Вот говорю
обяз тыкнут как сделать

я в принципе сделал все
Yandex
Объявления
29.03.2012, 17:42     Неявное преобразование типа
Ответ Создать тему
Опции темы

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