Для этой программы мне поручено проанализировать входной файл и затем вывести его несколькими способами. Один из способов его вывода - объединение информации из производных классов и необходимой информации из базового класса в строку. Я обязан сделать это с помощью 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. Спасибо.