Re: Problem overloading extraction operator
* EM.Bateman@gmail.com:
Working on Visual Studio .Net I've implemented a class:
#ifndef CONTRIBUTOR_H
#define CONTRIBUTOR_H
enum Gender {male=1, female, unk};
OK so far.
#include <iostream>
#include <iomanip>
Instead of these heavy-weight headers, consider using the light-weight
<iosfwd> in a header file.
#include <string>
using namespace std;
Never have "using namespace std" in a header file.
class Contributor
{
friend ostream& operator << (ostream& output, Contributor& RHS);
friend istream& operator >> (istream& input, Contributor& RHS);
Reserve all uppercase for macros. See this group's FAQ as well as
Bjarne Stroustrup's FAQs.
public:
Contributor();
Contributor(string Name, double Contribution, Gender MF, int IDKey);
Unrelated to C++ but, what does it matter whether a Contributor has a
penis, a vagina, or perhaps nothing? I'd remove that. Unless the
sexual organs really matter for the contribution (whatever it is). If,
for example, the gender information is used to establish a proper
honorific in a computer generated thank-you letter, it would be much
better design-wise to store the proper honorific. It would also yield
simpler code; see below.
Contributor(const Contributor ©);
Contributor& operator=(const Contributor& RHS);
bool operator== (const Contributor& RHS);
~Contributor() {cout << "In Contributor Destructor" << endl;}
private:
std::string Name;
double Contribution;
Gender MF;
int IDKey;
};
Note: with the data members you have there's no need to define a copy
constructor and assignment operator; the compiler generated ones will do
nicely.
Then I tried to overload the extraction operator thus:
istream& operator >> (istream& input, Contributor& RHS)
{
cout << "\nEnter a new contributor's name: ";
std::getline (cin, RHS.Name);
cout << "Enter the amount of their contribution: ";
cin >> RHS.Contribution;
cout << "What is the gender of the contributor? ";
cin >> RHS.MF;
cout << "Assign an ID Key to the contributor: ";
cin >> RHS.IDKey;
return input;
}
Consider how you would test your class with prepared data in a file.
Consider how you'd use it in a batch job (silent, no user interaction).
But I keep getting this error: error C2679: binary '>>' : no operator
found which takes a right-hand operand of type 'Gender' (or there is
no acceptable conversion)
I've got gender defined in my constructors as well as the overloading
implementation. I don't understand why I'm getting this error. Can
someone help?
Gender is defined as an enum type. You can provide an extractor for it.
That function (example below) /defines/, implicitly, the textual
representation of genders, here as simple decimal integers:
istream& operator>>( istream& input, Gender& g )
{
int genderVal;
input >> genderVal;
if( input.fail() ) { throw std::runtime_error( "Ouch ouch" ); }
// Here perhaps check the value and throw exception if not OK.
// Assuming it is OK:
g = static_cast<Gender>( genderVal );
return input;
}
Note that this would be very much easier it you stored a preferred
honorific (string) instead of a gender (enum).
Hth.,
- Alf
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?