Dev - C++ - Conversión de long a clase

 
Vista:

Conversión de long a clase

Publicado por flwrd21 (1 intervención) el 31/03/2018 15:29:41
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
#include <iostream>
#include <iomanip>
 
using namespace std;
 
class Tiempo{
	private:
	int h;
	int m;
	int s;
 
	public:
	Tiempo(int=22, int=15, int=59);
	void setTime(int, int, int);
	void getTime();
	Tiempo(long);
	 //~Tiempo(); 
}; //fin declaracion de la clase
//IMPLEMENTACION
 
Tiempo::Tiempo(int hs, int min, int seg)
{
	h=hs;
	m=min;
	s=seg;
}
//Tiempo::~Tiempo(){cout<<"\n soy el DESTRUCTOR de: ";}
Tiempo::Tiempo(long horafinal)
{
	h=int(horafinal/3600);
	m=int(((horafinal/3600)-h)*60);
	s=int((((horafinal/3600)-h)-m)*60);
	}
void Tiempo::setTime(int hs, int min, int seg)
{
	h=hs;
	m=min;
	s=seg;
return;
}
 
void Tiempo::getTime()
{
	cout<<"Hey bitch, the time is: ";
	cout<<setfill('0')
		<<setw(2)<<h<<":"
		<<setw(2)<<m<<":"
		<<setw(2)<<s;
	cout<<endl;
return;
}
int main(){
	//creo objetos tipo time:
	Tiempo a, b, c(8,5,59), d(30336);//para la hora c se estableció anteponiendo como type el nombre de la clase y entre () los parameters, bitch-
	b.setTime(16,29,59);
	a.getTime();
	b.getTime();
	c.getTime();
	d.getTime();
	a=Tiempo(52200);
	cout<<"El tiempo en a era 22:15:59, ahora es ";
	a.getTime();
 
return 0;
}
No hace la conversión deseada; ¿cómo hago para que el compilador se de cuenta que use el método Tiempo::Tiempo(long horafinal) y no el otro?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 338
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Conversión de long a clase

Publicado por Martín (158 intervenciones) el 06/04/2018 04:17:01
Hay una forma muy cómoda que es usando parámetros específicos para las horas, minutos y segundos, en la forma de pequeñas clases, y de esa manera no se confunden para el usuario ni para el compilador.

Y me parece que si además le agregas "literales definidos por el usuario" (user defined literals) para que cada parámetro lleve su correspondiente unidad, se hace mucho más seguro.

la función main() quedaría así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    Tiempo a;
    Tiempo b;
    Tiempo c(8_h, 5_min, 59_seg);  // cada parámetro con su unidad
    Tiempo d(30336_seg);
    b.setTime(16_h, 29_min, 59_seg);
    a.getTime();
    b.getTime();
    c.getTime();
    d.getTime();
    a = Tiempo(52200_seg);
    cout << "El tiempo en a era 22:15:59, ahora es ";
    a.getTime();
 
    return 0;
}

Claro que hay que escribir más, pero el usuario de tu clase Tiempo se va a equivocar menos.

El código sería algo así:

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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include <iostream>
#include <iomanip>
 
using namespace std;
 
struct Minuto;
struct Segundo;
 
struct Hora {
    Hora() = default;
    Hora(const Hora& h_) : h(h_.h) { }
    Hora(const unsigned long long& h_) : h(h_) { }
    Hora(const Segundo& s_);
 
    Hora operator/ (const Segundo& s);
 
    operator unsigned long long()
    {
        return h;
    }
 
    unsigned long long h;
};
 
struct Minuto {
    Minuto() = default;
    Minuto(const Minuto& m_) : m(m_.m) { }
    Minuto(unsigned long long m) : m(m) { }
    Minuto(const Segundo& s_);
 
    Minuto operator/ (Segundo s);
 
    operator unsigned long long()
    {
        return m;
    }
 
    unsigned long long m;
};
 
struct Segundo {
    Segundo() = default;
    Segundo(const Segundo& s_) : s(s_.s) { }
    Segundo(unsigned long long s) : s(s) { }
 
    unsigned long long operator/ (Segundo s);
 
    operator unsigned long long()
    {
        return s;
    }
 
    unsigned long long s;
};
 
Segundo operator"" _h(unsigned long long h)
{
    return Segundo(h * 3600);
}
 
Segundo operator"" _min(unsigned long long m)
{
    return Segundo(m * 60);
}
 
Segundo operator"" _seg(unsigned long long s)
{
    return Segundo(s);
}
 
Hora::Hora(const Segundo& s)
{
    h = s.s / 3600;
}
 
Hora Hora::operator/ (const Segundo& s_)
{
    return h / s_.s;
}
 
Minuto::Minuto(const Segundo& s)
{
    m = s.s / 60;
}
 
Minuto Minuto::operator/ (Segundo s_)
{
    return m / s_;
}
 
unsigned long long Segundo::operator/ (Segundo s_)
{
    return Segundo(s / s_.s);
}
 
class Tiempo {
private:
    Hora h;
    Minuto m;
    Segundo s;
 
public:
    Tiempo(Hora h = 22_h, Minuto m = 15_min, Segundo s = 59_seg)
        : h(h), m(m), s(s)
    { }
 
    Tiempo(Segundo);
 
    void setTime(Hora, Minuto, Segundo);
    void getTime();
}; //fin declaracion de la clase
 
Tiempo::Tiempo(Segundo horafinal)
{
    h = horafinal / 3600_seg;
    auto minutos = horafinal / 60_seg;
    m = minutos % 60_seg;
    s = horafinal % 60_seg;
}
 
void Tiempo::setTime(Hora hs, Minuto min, Segundo seg)
{
    h = hs;
    m = min;
    s = seg;
    return;
}
 
void Tiempo::getTime()
{
    cout << "Hey bitch, the time is: ";
    cout << setfill('0')
        << setw(2) << h << ":"
        << setw(2) << m << ":"
        << setw(2) << s;
    cout << endl;
    return;
}
 
int main()
{
    Tiempo a;
    Tiempo b;
    Tiempo c(8_h, 5_min, 59_seg);
    Tiempo d(30336_seg);
    b.setTime(16_h, 29_min, 59_seg);
    a.getTime();
    b.getTime();
    c.getTime();
    d.getTime();
    a = Tiempo(52200_seg);
    cout << "El tiempo en a era 22:15:59, ahora es ";
    a.getTime();
 
    return 0;
}

// Si hay alguien interesado en alguna explicación adicional o clases particulares, me pueden escribir un mail privado !!
Martín
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar