. Advertisement .
..3..
. Advertisement .
..4..
How to solve the problem – call to non-static member function without an object argument? I have the sample detail:
The output looking like:
f1 = 3/6, f2 = 4/5
f1 + f2 = 39/30 = 13/10 = 1.3
f1 - f2 = -9/30 = -3/10 = -0.3
f1 * f2 = 12/30 = 2/5 = 0.4
f1 / f2 = 15/24 = 5/8 = 0.625
Enter a fraction [numerator denominator]: 2 5
You entered 2/5
#include "Fraction.h"
#include <iostream>
using namespace std;
Fraction::Fraction(const int numerator, const int denominator) { }
int Fraction::getNumerator() const {
return numerator;
}
int Fraction::getDenominator() const {
return denominator;
}
int Fraction::gcd() const {
int n = numerator;
int d = denominator;
int temp;
while (d!=0) {
temp = n % d;
n = d;
d = temp;
}
return n;
}
void Fraction::setNumerator(const int numerator) {
this->numerator = numerator;
}
void Fraction::setDenominator(const int denominator) {
this->denominator = denominator;
}
string Fraction::toString() const {
return "";
}
double Fraction::returnDecimal() const {
double a = (double) getNumerator();
double b = (double) getDenominator();
return (a / b);
}
void Fraction::reduce() {
int a = gcd();
int b = numerator / a;
int c = denominator / a;
setNumerator(b);
setDenominator(c);
}
Fraction Fraction::operator +(const Fraction& f) const {
Fraction temp;
int a = getNumerator();
int b = getDenominator();
int c = f.getNumerator();
int d = f.getDenominator();
int tempOne = b;
int tempTwo = d;
a = a * tempTwo;
b = b * tempTwo;
c = c * tempOne;
d = d * tempOne;
temp.setNumerator(a+c);
temp.setDenominator(d);
return temp;
}
Fraction Fraction::operator -(const Fraction& f) const {
Fraction temp;
int a = getNumerator();
int b = getDenominator();
int c = f.getNumerator();
int d = f.getDenominator();
int tempOne = b;
int tempTwo = d;
a = a * tempTwo;
b = b * tempTwo;
c = c * tempOne;
d = d * tempOne;
temp.setNumerator(a-c);
temp.setDenominator(d);
return temp;
}
Fraction Fraction::operator *(const Fraction& f) const {
Fraction temp;
temp.setNumerator(getNumerator() * f.getNumerator());
temp.setDenominator(getDenominator() * f.getDenominator());
return temp;
}
Fraction Fraction::operator /(const Fraction& f) const {
Fraction temp;
temp.setNumerator(getNumerator() * f.getDenominator());
temp.setDenominator(getDenominator() * f.getNumerator());
return temp;
}
bool Fraction::operator ==(const Fraction& f) const {
return ( (getNumerator() == f.getNumerator()) && (getDenominator() == f.getDenominator()) );
}
bool Fraction::operator !=(const Fraction& f) const {
return !( (getNumerator() == f.getNumerator()) && (getDenominator() == f.getDenominator()) );
}
bool Fraction::operator <(const Fraction& f) const {
double a = getNumerator();
double b = getDenominator();
double c = getNumerator();
double d = getDenominator();
return ((a/b) < (c/d));
}
bool Fraction::operator <=(const Fraction& f) const {
double a = getNumerator();
double b = getDenominator();
double c = getNumerator();
double d = getDenominator();
return ((a/b) <= (c/d));
}
bool Fraction::operator >(const Fraction& f) const {
double a = getNumerator();
double b = getDenominator();
double c = getNumerator();
double d = getDenominator();
return ((a/b) > (c/d));
}
bool Fraction::operator >=(const Fraction& f) const {
double a = getNumerator();
double b = getDenominator();
double c = getNumerator();
double d = getDenominator();
return ((a/b) >= (c/d));
}
ostream& operator <<(ostream& out, const Fraction& f) {
out << f.getNumerator() << "/" << f.getDenominator();
return out;
}
istream& operator >>(istream& in, Fraction& f) {
int a;
int b;
in >> a >> b;
f.setNumerator(a);
f.setDenominator(b);
return in;
}
#include <iostream>
#include "Fraction.h"
#include "Fraction.cpp"
using namespace std;
int main(int argc, const char * argv[])
{
Fraction::getNumerator() const;
Fraction::getDenominator() const;
Fraction::gcd() const;
Fraction::setNumerator(<#const int numerator#>);
Fraction::setDenominator(<#const int denominator#>);
Fraction::toString();
Fraction::returnDecimal() const;
Fraction::reduce();
return 0;
}
#include <iostream>
#include <string>
using namespace std;
class Fraction {
private:
int numerator;
int denominator;
int gcd() const;
public:
Fraction(const int numerator = 0, const int denominator = 0);
int getNumerator() const;
int getDenominator() const;
void setNumerator(const int numerator);
void setDenominator(const int denominator);
string toString() const;
double returnDecimal() const;
void reduce();
bool operator ==(const Fraction& f) const;
bool operator !=(const Fraction& f) const;
bool operator <(const Fraction& f) const;
bool operator <=(const Fraction& f) const;
bool operator >(const Fraction& f) const;
bool operator >=(const Fraction& f) const;
Fraction operator +(const Fraction& f) const;
Fraction operator -(const Fraction& f) const;
Fraction operator *(const Fraction& f) const;
Fraction operator /(const Fraction& f) const;
friend ostream& operator <<(ostream&, const Fraction&);
friend istream& operator >>(istream&, Fraction&);
};
While I was running it, I found the warning message:
call to non-static member function without an object argument
That is my question in my midterm exam, and it is urgent. I searched the solutions on some websites, but I didn’t get it. I may miss any line or other changes. I appreciate your assistance!
The cause:
You got this error because you are trying to access the functions of a class but you don’t instantiate it.
Solution:
Fraction is a class, so before using its (not static) functions, you need create an object of that class.
You can do as following:
Fraction is a type of class. To call the nonstatic functions of this class, you need an object from that class.