Является ли дружественная функция, которая перегружает оператор вставки, предназначенной для объявления и определения в базовом классе или в каждом производном классе? - PullRequest
0 голосов
/ 01 февраля 2020

Для этой программы мне поручено проанализировать входной файл и затем вывести его несколькими способами. Один из способов его вывода - объединение информации из производных классов и необходимой информации из базового класса в строку. Я обязан сделать это с помощью stringstream и перегружая оператор вставки. В моем учебнике говорится, что в базовом классе должна быть объявлена ​​функция friend, а в каждом производном и базовом классах - toString () fun c. Однако, когда я пытаюсь провести l oop через вектор указателей на каждый объект класса, он просто дает мне строку чисел (я подозреваю, что это адрес?) Пожалуйста, помогите. Я включу весь необходимый код и текущий вывод, а также ожидаемый вывод.

#include "university.h"
#include "snap.h"
#include "csg.h"
#include "cdh.h"
#include "cr.h"

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

int main(int argc, char* argv[]) {

    vector<University*> allDataObjects;

    cout << "Input file: " << argv[1] << endl;
    ifstream in(argv[1]);
    if (!in)
    {
        cerr << "Unable to open " << argv[1] << " for input";
        return 2;
    }
    cout << "Output file: " << argv[2] << endl;
    ofstream out(argv[2]);
    if (!out)
    {
        in.close();
        cerr << "Unable to open " << argv[2] << " for output";
        return 3;
    }

    for (string currLine; getline(in, currLine);) {

        if ("snap(" == currLine.substr(0, 5)) { // Ex. snap(12345,Charlie Brown,Manager,555-1234).
            cout << currLine << endl;

            string stuID = currLine.substr(5, currLine.find(',') - 5);
            currLine = currLine.substr(currLine.find(',') + 1);
            string stuName = currLine.substr(0, currLine.find(','));
            currLine = currLine.substr(currLine.find(',') + 1);
            string stuAddress = currLine.substr(0, currLine.find(','));
            currLine = currLine.substr(currLine.find(',') + 1);
            string stuPhone = currLine.substr(0, currLine.find(')'));

            allDataObjects.push_back(new Snap(stuID, stuName, stuAddress, stuPhone));
        }
    ...
    }
    cout << endl << "Vectors: " << endl;
    for (unsigned int i = 0; i < allDataObjects.size(); i++) {
        cout << allDataObjects[i] << endl;
    }

    return 0;
};

Базовый класс:

#ifndef UNIVERSITY_H
#define UNIVERSITY_H

#include <iostream>
#include <sstream>

using namespace std;

class University {
public:
    University(string stuID = "", string courseNew = "") { studentID = stuID; courseName = courseNew; }
    ~University() = default;

    string ToString() { 
        ostringstream id;
        id << courseName << studentID;
        return id.str(); 
    }
    friend std::ostream& operator<< (ostream& os, University& uni) {
        os << uni.ToString();
        return os;
    }   
private:
    string studentID;
    string courseName;
};
#endif

Производный класс:

#ifndef SNAP_H
#define SNAP_H

#include "university.h"
#include <iostream>
#include <sstream>

using namespace std;

class Snap : public University { // studentID, studentName, studentAddress, studentPhone
public:
    Snap(const string& stuID, string stuName, string stuAddress, string stuPhone) :
        University(stuID), studentName(stuName), studentAddress(stuAddress), studentPhone(studentPhone) {}
private:
    string studentName;
    string studentAddress;
    string studentPhone;
    string ToString() {
        ostringstream out;
        out << "snap(" << University::ToString() << "," << studentName << "," << studentAddress << "," << 
    studentPhone << ")";
        return out.str();
    };
};

Текущий Выходные данные -> Ожидаемый выходной сигнал

Input Strings:                                              Input Strings:
snap(12345,Charlie Brown,Manager,555-1234).     ->          snap(12345,Charlie Brown,Manager,555-1234).
snap(67890,Lucy,Right Field,555-5678).                      snap(67890,Lucy,Right Field,555-5678).
...                                                         ...
                                                ->
Vectors:                                                    Vectors:
00BFF2F0                                                    snap(12345,Charlie Brown,Manager,555-1234)
00C03710                                        ->          snap(67890,Lucy,Right Field,555-5678)
...

Буквально я просто должен вывести точно такую ​​же строку (без периода), но используя полиморфизм и перегруженный оператор. Я не получаю никаких ошибок, так что это явно проблема логики c. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...