实现私有类成员的重载构造函数

问题描述 投票:1回答:1

在此代码中,我有一个重载的构造函数Record::Record(string s),它读取一个字符串,我试图从's'创建一个字符串流,并使用getline(stringStream,line,“,”)从字符串中读取每个元素使用“,”作为分隔符,然后将每个元素分配给适当的对象变量。分配的最终目的是打开一个文件,读取其数据,在向量中适当分配数据,然后将数据写入并解析为一个新文件。

我对与私人班级成员合作的理解有限。我不确定如何去编写构造函数。过去,我曾为私有成员使用过一个指针(例如'this-> foo;),这时我只需要了解如何实现Record的内容,到目前为止,我尝试过的内容是不正确的,只能找到使用int指针的引用。

通常,我会去我的comp-sci实验室询问一个TA,但由于COVID,它目前已关闭。

这是我的构造函数和重载运算符的代码。

Record.cpp

    #include <string>
    #include <sstream>
    #include "Record.h"

    using namespace std;

    Record::Record(string s) {

  /**  here is where I need to assign data to the following.
                std::string department;
                std::string item_code;
                int quantity;
                double cost;  **/
    }

    Record::~Record() {
        // TODO Auto-generated destructor stub
    }

    //overloaded "==" and "<" comparison operators

    bool operator ==(const Record &lhs, const Record &rhs){
        return (lhs.cost == rhs.cost && lhs.department == rhs.department &&
                lhs.item_code == rhs.item_code && lhs.quantity == rhs.quantity);
    }

    /**bool operator <(const Record &a, const Record &b){ //do not need at this time

    }
    **/

    //Overloaded "<<" operator
    std::ostream& operator <<(std::ostream& os, const Record& r){
        os << r.department << ',' << r.item_code << ',' <<  r.quantity << ',' << r.cost;
        return os;

    }

Record.h

#ifndef RECORD_H_
#define RECORD_H_

#include <iostream>
#include <string>

class Record {
public:

    //Constructor
    Record(std::string s); //pass this string to our Record class

    //De-constructor
    virtual ~Record();

    //overloaded "==" and "<" comparison operators

    friend bool operator ==(const Record &a, const Record &b);

    //friend bool operator <(const Record &a, const Record &b);  //Do not need at this time.

    //Overloaded "<<" operator

    friend std::ostream& operator <<(std::ostream&, const Record&);


private:
        std::string department;
        std::string item_code;
        int quantity;
        double cost;

};

#endif /* RECORD_H_ */

Main.cpp

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <libgen.h>
#include <fstream>
#include <sstream>
#include <vector>
#include <algorithm>
#include "Record.h"
using namespace std;

int main() {

    vector<Record> records; //vector of type Records to hold each "Line" of input file
    string filename;        // File name and path stored as string

    /**
     * Prompts user for the name of input file and stores in string variable filename
     *
     */
    cout << "please enter the name of your file with file path:" << endl;
    cin >> filename;
    ifstream ifs { filename.c_str() };
    if (!ifs) {
        cerr << " Can't open file " << filename << endl;
        return 1;
    }

    string path = filename.substr(0, filename.find_last_of("\\/"));
    string file = filename.substr(filename.find_last_of("\\/") + 1,
            filename.length());
    if (path.compare(file) == 0) {
        path == "";
    }
    //test for file and file path

    cout << "Path portion of " << filename << " is " << path << endl;
    cout << "File portion of " << filename << " is " << file << endl; // path + "new_" + file + ".cvs", make new file with new path

    /**
     * Put each line of input file in to the records vector
     */

    string line; //strings for each parameter of the vector object


    while (getline(ifs, line)) {

        Record newRecord(line); //this should check for duplicates and ignore any found.
        int i = 0;
        int n = 0;
            if((newRecord == records[i]) || (i < n) ){
                i++;
            }
            else{
                records.push_back(newRecord);
                n++;
                i = 0;
            }
    }
    ifs.close(); //closes the stream

    //create new file and output data to it
    string newFile = ("new_" + file + ".cvs");

    //check to see if file path and file name are correct
    cout << (path + newFile);


    //Open stream to new file and write to it

    ofstream ofs(path + newFile);
    ofs.open(newFile);

    for(size_t i = 0; i < records.size(); i++){
        ofs << (i+1) << ' ' << records[i];
    }

    ofs.close(); //close output stream

    return 0;
}
c++ class parsing private stringstream
1个回答
0
投票
Record::Record(std::string s){ std::string word; std::vector<std::string> temp; std::stringstream ss(s); while(getline(ss, word, ',')) temp.push_back(word); department = temp.at(0); item_code = temp.at(1); quantity = stoi(temp.at(2)); cost = stod(temp.at(3)); }

例如,从文件中读取每一行:

int main()
{
    std::string s;       
    std::ifstream file ("file");   
    if (file.is_open()){       
        while(getline(file, s)) {         
            Record r(s);              
        }
    }
}

我假设您的意思是每个参数用','分隔,而不是每行分隔,如果不是这样,请说点什么。

Running sample
© www.soinside.com 2019 - 2024. All rights reserved.