I had this program working perfectly in one main file.
But I needed to separate it into header and source files.
I'm now getting a ton of errors and I am at a loss for what I am missing here.
Tested the main with a classmates header and source files and it worked. So the problem is in the header or source file.
#ifndef JMTDRational
#define JMTDRational
#include <string>
#include <sstream>
class JMTDRational{
private:
int numerator;
int denominator;
public:
void set_numerator(int num);
void set_denominator(int den);
int get_numerator() const;
int get_denominator() const;
std::string r_to_string();
double r_to_decimal();
JMTDRational add(const JMTDRational & obj);
JMTDRational subtract(const JMTDRational & obj);
JMTDRational multiply(const JMTDRational & obj);
JMTDRational divide(const JMTDRational & obj);
JMTDRational();
JMTDRational(int num,int den);
JMTDRational reduce(const JMTDRational);
int gcd(int n, int d);
};
#endif // JMTDRational
#include "JMTDRational.h"
void JMTDRational::set_numerator(int num)
{
numerator = num;
}
void JMTDRational::set_denominator(int den)
{
if (den != 0) {
denominator = den;
}
else{
denominator = 1;
}
}
int JMTDRational::get_numerator() const
{
return numerator;
}
int JMTDRational::get_denominator() const
{
return denominator;
}
string JMTDRational::r_to_string()
{
ostringstream str1, str2;
str1 << get_numerator();
str2 << get_denominator();
string temp = str1.str() + "/" + str2.str();
return temp;
}
double JMTDRational::r_to_decimal()
{
double temp = get_numerator() / get_denominator();
return temp;
}
JMTDRational::JMTDRational(int num,int den) {
numerator = num;
denominator = den;
}
JMTDRational::JMTDRational() {
numerator = 0;
denominator = 1;
}
JMTDRational JMTDRational::reduce(const JMTDRational)
{
int temp_numerator = get_numerator() / gcd(get_numerator(),get_denominator());
int temp_denominator = get_denominator() / gcd(get_numerator(),get_denominator());
JMTDRational temp(temp_numerator,temp_denominator);
return temp;
}
int JMTDRational::gcd(int n, int d)
{
if (d == 0)
return n;
return gcd(d, n % d);
}
JMTDRational JMTDRational::add(const JMTDRational & obj)
{
int temp_numerator = get_numerator() * obj.get_denominator() + obj.get_numerator() * get_denominator();
int temp_denominator = get_denominator() * obj.get_numerator();
JMTDRational temp(temp_numerator,temp_denominator);
return temp;
}
JMTDRational JMTDRational::subtract(const JMTDRational & obj)
{
int temp_numerator = get_numerator() * obj.get_denominator() - obj.get_numerator() * get_denominator();
int temp_denominator = get_denominator() * obj.get_numerator();
JMTDRational temp(temp_numerator,temp_denominator);
return temp;
}
JMTDRational JMTDRational::multiply(const JMTDRational & obj)
{
int temp_numerator = get_numerator() * obj.get_numerator();
int temp_denominator = get_denominator() * obj.get_denominator();
JMTDRational temp(temp_numerator,temp_denominator);
return temp;
}
JMTDRational JMTDRational::divide(const JMTDRational & obj)
{
int temp_numerator = get_numerator() * obj.get_denominator();
int temp_denominator = get_denominator() * obj.get_numerator();
JMTDRational temp(temp_numerator,temp_denominator);
return temp;
}
In the header file You have defined the name: JMTDRational to an empty value.
#ifndef JMTDRational
#define JMTDRational
#include <string>
#include <sstream>
class JMTDRational{
So everywhere in your code where You have the name JMTDRational the preprocessor replaces it with "nothing".
For example:
JMTDRational add(const JMTDRational & obj);
JMTDRational subtract(const JMTDRational & obj);
becomes:
add(const& obj);
subtract(const & obj);
which is invalid code.
You need a unique hardened name in the Header guard:
#define JMTDRATIONAL_H_HEADER
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With