redice
asked on
overloaded operator+
I have an assignment that I just can't quite get to work. Here are the steps
meal class - two fields (entree/calorie count integer) include a constructor that sets meal's feilds with arguments or uses default values when no arguments are provided. Include an overloaded insertion operator to display meal values and an overloaded extraction operator that prompts the user for entree name and calorie count for a meal
then I need an overloaded operator+() function that will add two or more meal objects(calorie values and creating a summary meal obj to store 'daily total' in entree field
the final step is to have a main program that declares for meal obj breakfast, lunch, dinner and total and include the statement total = breakfast +lunch+dinner and display values for the 4 meal obj.
I know it's long assignment and I've tried it several ways, but I know I am missing code. I am just not sure what I am missing. Any help would be appreciated.
#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <fstream.h>
class Meal
{
friend ostream& operator<<(ostream& out, const Meal &aMeal);
friend istream& operator>>(istream& in, Meal &aMeal);
private:
char *entree;
double calories;
public:
Meal(char ent, int cal);
double operator+(const Meal &Meal);
};
ostream& operator<<(ostream& out, const Meal &aMeal)
{
out<< "Meal includes " <<aMeal.entree
<< " for " <<aMeal.calories<<endl;
return (out);
}
istream& operator>>(istream &in, Meal &aMeal)
{
cout<< " Enter food name ";
in>>aMeal.entree;
cout<< " Enter number of Calories" ;
in>>aMeal.calories;
cout<<endl<<" Your Food Intake" <<endl;
return(in);
}
Meal::Meal(char ent, int cal)
{
*entree = ent;
calories = cal;
}
double Meal::operator+(const Meal &aMeal)
{
double total;
total = calories + aMeal.calories;
return (total);
}
void main()
{
double total;
Meal Breakfast(' ',200);
Meal Lunch(' ', 100);
Meal Dinner(' ', 140);
cout<<" Enter Breakfast"<<endl;
cin>>Breakfast;
cin>>Lunch;
cin>>Dinner;
cout<<Lunch;
cout<<Dinner;
total = Breakfast + Lunch;
cout<<total<<endl;
getch();
}
meal class - two fields (entree/calorie count integer) include a constructor that sets meal's feilds with arguments or uses default values when no arguments are provided. Include an overloaded insertion operator to display meal values and an overloaded extraction operator that prompts the user for entree name and calorie count for a meal
then I need an overloaded operator+() function that will add two or more meal objects(calorie values and creating a summary meal obj to store 'daily total' in entree field
the final step is to have a main program that declares for meal obj breakfast, lunch, dinner and total and include the statement total = breakfast +lunch+dinner and display values for the 4 meal obj.
I know it's long assignment and I've tried it several ways, but I know I am missing code. I am just not sure what I am missing. Any help would be appreciated.
#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <fstream.h>
class Meal
{
friend ostream& operator<<(ostream& out, const Meal &aMeal);
friend istream& operator>>(istream& in, Meal &aMeal);
private:
char *entree;
double calories;
public:
Meal(char ent, int cal);
double operator+(const Meal &Meal);
};
ostream& operator<<(ostream& out, const Meal &aMeal)
{
out<< "Meal includes " <<aMeal.entree
<< " for " <<aMeal.calories<<endl;
return (out);
}
istream& operator>>(istream &in, Meal &aMeal)
{
cout<< " Enter food name ";
in>>aMeal.entree;
cout<< " Enter number of Calories" ;
in>>aMeal.calories;
cout<<endl<<" Your Food Intake" <<endl;
return(in);
}
Meal::Meal(char ent, int cal)
{
*entree = ent;
calories = cal;
}
double Meal::operator+(const Meal &aMeal)
{
double total;
total = calories + aMeal.calories;
return (total);
}
void main()
{
double total;
Meal Breakfast(' ',200);
Meal Lunch(' ', 100);
Meal Dinner(' ', 140);
cout<<" Enter Breakfast"<<endl;
cin>>Breakfast;
cin>>Lunch;
cin>>Dinner;
cout<<Lunch;
cout<<Dinner;
total = Breakfast + Lunch;
cout<<total<<endl;
getch();
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
BTW, the canonical format for operator+ is:
const Meal Meal::operator+(const Meal &rhs)
{
Meal tmp ( this ); // copy construct
tmp += rhs; // employ operator+= to do the real work
return tmp;
}
const Meal Meal::operator+(const Meal &rhs)
{
Meal tmp ( this ); // copy construct
tmp += rhs; // employ operator+= to do the real work
return tmp;
}
Yeah, SteH is basically saying that it would be better to use the string class instead of char* for simplicity.
If you have not been taught about this class yet though:
Meal::Meal(char ent, int cal)
{
*entree = ent;
calories = cal;
}
is wrong. You need to write:
Meal::Meal(char* ent, int cal)
{
calories = cal;
entree = new char[strlen(ent)+1];
strcpy(entree, ent)
}
This allocates the required amount of memory that the entree is then stored in. Of course, since you are now alloacating memory with new, you must delete it explicitly.
Hence:
Meal::~Meal()
{
delete [] entree;
}
If you have not been taught about this class yet though:
Meal::Meal(char ent, int cal)
{
*entree = ent;
calories = cal;
}
is wrong. You need to write:
Meal::Meal(char* ent, int cal)
{
calories = cal;
entree = new char[strlen(ent)+1];
strcpy(entree, ent)
}
This allocates the required amount of memory that the entree is then stored in. Of course, since you are now alloacating memory with new, you must delete it explicitly.
Hence:
Meal::~Meal()
{
delete [] entree;
}
ASKER
Thanks for the help again. The class isn't for credit anyway and I'm not a programmer by any means. Have a great day.
ASKER
operator+ is returning a double not a Meal. Now
Meal a, b, c;
What does
double total = a + b + c;
mean?
Not sure what it means?
Meal a, b, c;
What does
double total = a + b + c;
mean?
Not sure what it means?
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
>>your overloaded operator+ should return the memory location of the result...
>>so your function definition should look like this:
>> double& Meal::operator+(const Meal &aMeal);
You'd suggest to return a reference to a local variable?
>>so your function definition should look like this:
>> double& Meal::operator+(const Meal &aMeal);
You'd suggest to return a reference to a local variable?
indeed
And you do that without blushing?
int& foo () {
int i = 4;
return i;
}
int& foo () {
int i = 4;
return i;
}
I once used a similar thing for strings...
my code looked like this:
CString& CString::operator+( const CString& str )
{
size_t lgth = len + str.len;
char *t = new char[lgth + 1];
strcpy( t, s );
strcat( t, str.s );
return CString(t);
}
.K.
my code looked like this:
CString& CString::operator+( const CString& str )
{
size_t lgth = len + str.len;
char *t = new char[lgth + 1];
strcpy( t, s );
strcat( t, str.s );
return CString(t);
}
.K.
You should have received a compiler warning and a memory leak at runtime.
well I did NOT!
and I am sorry trying to help you!
please excuse me.
.K.
and I am sorry trying to help you!
please excuse me.
.K.
I wouldn't call it a memory leak ... it's more of a 'dangling reference'. The local auto variables would already have been cleaned up.
BTW, as a chuckling side-note, the original reply from jkr did have the method signature:
>> Meal& Meal::operator+(const Meal &r)
An oversight I'm sure, but still worth a chuckle.
BTW, as a chuckling side-note, the original reply from jkr did have the method signature:
>> Meal& Meal::operator+(const Meal &r)
An oversight I'm sure, but still worth a chuckle.
No comment has been added lately, so it's time to clean up this question.
I will leave the following recommendation for this question in the Cleanup topic area:
Split: jkr {http:#9633937} & SteH {http:#9633940} & _ys_ {http:#9634703} & xssass {http:#9959291}
Please leave any comments here within the next four days.
PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER!
Tinchos
EE Cleanup Volunteer
I will leave the following recommendation for this question in the Cleanup topic area:
Split: jkr {http:#9633937} & SteH {http:#9633940} & _ys_ {http:#9634703} & xssass {http:#9959291}
Please leave any comments here within the next four days.
PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER!
Tinchos
EE Cleanup Volunteer
ASKER