Constructor Conversion

Hi There,



following is my main(). Requirement is Rational a=1 assignement should work but Rational a=1.2 shouldnt. Copiler should error when compliling Rational a=1.2. I tried overloading = operator using following function but it also allows Rational a=1.2 go through with truncation, which i dont want. Please help

void operator=(int n)
{
Rational(n,1)
}

Let me know if you need more details.

main()
{
Rational a=1;
Rational a=1.2

}

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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228

//rational.h
#include<iostream>

class Rational
{
private:
    // Private functions
    void Normalize(); // To be implemented in the rational.cpp file
	int  m_num;    // numerator
    int  m_den;    // denominator  

	Rational( double n,double d)
	{
	}

public:

  Rational operator-();
  Rational operator+();

  friend Rational operator+(Rational,Rational);
  friend double operator+(double,Rational);
  friend double operator+(Rational,double);

  friend Rational operator-(Rational,Rational);
  friend double operator-(Rational,double);
  friend double operator-(double, Rational);
  
  friend Rational operator*(Rational,Rational);
  friend double operator*(Rational,double);
  friend double operator*(double,Rational);

  friend Rational operator/(Rational,Rational);
  friend double operator/(double,Rational);
  friend double operator/(Rational,double);
  
    
 explicit Rational (const int n=0,const int d=1)
	  {
       m_num=n;
	   m_den=d;
	   Normalize();
	  }
Rational (int &n);



operator double()
{
return double(m_num)/double(m_den);
}
     
void Print();   // Implemented in the rational.cpp file

// Access member functions
int Numerator()     { return m_num; }
int Denominator()   { return m_den; }
  
};

 



// rational.cpp

#include "rational.h"
#include <iostream>
using namespace std;

void Rational::Print()
{
	if (m_num/m_den < 0)
	{
		std:: cout << '-';
	}
	Normalize();
	std:: cout << '(' << m_num 
		     << '/' << m_den << ')'
		     << std:: endl;
}

Rational Rational::operator-() // unary minus overloading
   {
	  /*Rational unminus;
	  unminus.m_num=(-r1.m_num);
	  unminus.m_den=(-r1.m_den);	
	  unminus.Normalize ();
	  return unminus;*/
	   return Rational(-(this->Numerator()), this->Denominator());
   }
Rational Rational::operator+() // unary Plus overloading
   {
	  /*Rational unplus;
	  unplus.m_num=(r1.m_num);
	  unplus.m_den=(r1.m_den);	
	  unplus.Normalize ();
	  return unplus;*/
	   return *this;
   }
Rational operator+(Rational r1, Rational r2) // Rational + Rational
{
Rational ratplus;
ratplus.m_num =(r1.m_num)*(r2.m_den)+ (r2.m_num)*(r1.m_den);
ratplus.m_den =(r2.m_den)*(r1.m_den) ;
ratplus.Normalize ();
return ratplus;
}
double operator+(double r1, Rational r2) // double + Rational
{
double ratplus;
ratplus=r2; 
return r1 + ratplus;
}

double operator+(Rational r1, double r2) // Rational + double
{
double ratplus;
ratplus=r1; 
return ratplus + r2;

}
Rational operator-(Rational r1, Rational r2) // Rational - Rational
{
Rational ratplus;
ratplus.m_num =(r1.m_num)*(r2.m_den)-(r2.m_num)*(r1.m_den);
ratplus.m_den =(r2.m_den)*(r1.m_den) ;
ratplus.Normalize ();
return ratplus;
}
double operator-(double r1, Rational r2) // double - Rational
{
double ratplus;
ratplus=r1-(r2.m_num)/(r2.m_den); 
return ratplus;
}

double operator-(Rational r1, double r2) // Rational - double
{
	double dlhs = r1;
	return dlhs + r2;
}

Rational operator*(Rational r1, Rational r2) // Rational*Rational 
{
Rational ratmult;
ratmult.m_num =r1.m_num * r2.m_num ;
ratmult.m_den =r1.m_den * r2.m_den ;
ratmult.Normalize ();
return ratmult;
}
double operator*(double r1, Rational r2) // double * Rational
{
double ratplus;
ratplus=(r1*r2.m_num)/(r2.m_den); 
return ratplus;
}

double operator*(Rational r1, double r2) // Rational * double
{
double dr1 = r1;
return dr1 * r2;
}


Rational operator/(Rational r1, Rational r2) // Binary division overloading
{
Rational ratdiv;
ratdiv.m_num =(r1.m_num * r2.m_den) ;
ratdiv.m_den =(r1.m_den * r2.m_num );
ratdiv.Normalize ();
return ratdiv;
}

double operator/(double r1, Rational r2) // double / Rational
{
double ratplus;
ratplus=(r1*r2.m_den)/r2.m_den; 
return ratplus;
}

double operator/(Rational r1, double r2) // Rational / double
{
double dr1 = r1;
return dr1/r2;
}



void Rational::Normalize()           // Normalize() defination
{

    if ( (m_num == 0) || (m_den == 0) )
        int a=1;

    if (m_num < 0)
        m_num = -m_num;
    if (m_den < 0)
        m_den = -m_den;

    // Euclid's algorithm...
    int a, b, r;

    if (m_den > m_num)
    {
        a = m_den;
        b = m_num;
    }
    else
    {
        a = m_num;
        b = m_den;
    }
    r = 1;
    while (r > 0 && b > 0)
    {
        r = a % b;
        a = b;
        b = r;
    }
    m_num=m_num/a;
	m_den=m_den/a;

}


Last edited on
Topic archived. No new replies allowed.