C++ Extraction Operator for Class Functions

蹲街弑〆低调 提交于 2019-12-13 02:47:15

问题


I'm not sure if operator overloading is what I'm looking for, but I need to know the best way to achieve the following in C++;

I have a class Employee (for simplicity) with just an ID number atm. Please assume the input file has an int number and some characters after (1 line shown only), such as:

1234 Charles Hammond

Here is the code so far. I am trying to use the extraction operator to get the integer and other data from input file to my class function (SetID);

class Employee
{
    int employeeID;

public:
     void SetID(int);
}

void Employee::SetID(int empID)
{
    employeeID = empID;
}

int main(void)
{
    int lineCounter = 4;
    Employee emp;

    //Create filestream objects and open
    ifstream input;
    ofstream output;
    input.open("input.txt");
    output.open("output.txt");


    for (int i = 0; i < lineCounter; i++)
    {
        input >> emp.SetID(input.get()); //illegal? Best way to do this
    }


    //Close program
    output.close();
    input.close();
    system("pause");
    return 0;
}

I am simply trying to get the ID from the input file and store it in the class member "employeeID" to be used for calculations later.


回答1:


One option is to overload the >> operator and make it a friend function in your Employee class.

Something like:

istream& operator>>( istream& in, Employee& emp )
{
    in >> emp.employeeID;
    return in;
}

And in your Employee class:

friend istream& operator>> (istream& in, Employee& emp);



回答2:


There are a ton of ways to do this, each with pluses and minuses. The format of the data you're reading indicates you have one "record" per line, in which case that should be enforced somehow. The following does that by reading a line of data from the input file, then sending that line through a string stream for further processing:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

class Employee
{
    // friend this operator, as we'll give it access to our
    //  private data members of our class.
    friend std::istream& operator >>(std::istream& inp, Employee& obj);

    int employeeID;

public:
    void setID(int id) { employeeID = id; }
    int getID() const { return employeeID; }
};

// extracts a single employee from a single input line taken from
//  the passed input stream. the code below mandates one, and only
//  one employee per line.
std::istream& operator >>(std::istream& inp, Employee& obj)
{
    // used as a full-line-buffer to enforce single-record-per-line
    std::string line;
    if (std::getline(inp, line))
    {
        // think of it as an in-memory stream primed with our line
        // (because that's exactly what it is).
        std::istringstream iss(line);

        // TODO: eventually you'll want this to parse *all* values from
        //  the input line, not just the id, storing each in a separate
        //  member of the Employee object being loaded. for now we get
        //  only the id and discard the rest of the line.
        if (!(iss >> obj.employeeID))
        {
            // a failure to read from the line string stream should flag
            //  the input stream we read the line from as failed. we also
            //  output the invalid line to std::cerr.
            inp.setstate(std::ios::failbit);
            std::cerr << "Invalid format: " << line << std::endl;
        }
    }
    return inp;
}


int main()
{
    // open input and output files
    std::ifstream input("input.txt");

    // read at-most four employee lines from our file. If there are
    //  less than that or a read-error is encountered, we will break
    //  early.
    Employee emp;
    for (int i=0; i<4 && input >> emp; ++i)
    {
        // do something with this thing
        std::cout << "Read Employee: " << emp.getID() << '\n';
    }

    system("pause");
    return 0;
}


来源:https://stackoverflow.com/questions/23925866/c-extraction-operator-for-class-functions

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!