c ++ записать вывод функции-члена в текстовый файл - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь записать вывод функции-члена моего класса в текстовый файл.Я не могу заставить свой оператор перегрузки вывода работать так, как я хочу.Я наивно использую неопознанные параметры в строке

 outStream << myClass.myMemberFunction(x1, x2, results)

, потому что я до сих пор не нашел ни одного метода, который работал бы, не меняя ничего в myMemberFunction.

Вот пример:

заголовочный файл

proper include guards


class myClass {

public:

bool myMemberFunction( int& x1, int& x2, std::vector<int> results);


friend ostream &operator<< (ostream& out, myClass& Class)


};

, затем в

исходный файл classDef

proper include files

using namespace std;
using std::vector;

bool myClass::myMemberFunction(int& x1, int& x2, vector<int> results) {

int x3;
x3 = x1 + x2;
results.push_back(x3);

return true;
};

myClass& operator<< (ostream& out, myClass& myClass) {

ofstream outStream;

outStream.open("emptyFile.txt", ios::app);

if (outStream.is_open()) {
    outStream << myClass.myMemberFunction(x1, x2, results);

важная часть здесь заключается в том, что я хочу вывести значения, которые хранятся в векторе результатов

    outStream.close();
}
else throw "Unable to open file";
}

Есть ли способ сделать это без изменения myMemberFunction?

1 Ответ

0 голосов
/ 06 октября 2018
ofstream& operator<< (ofstream& out, const myClass& instance) {
    std::vector<int> results;
    instance.myMemberFunction(x1, x2, results); // x1 and x2 need to be defined
    for(int i : results) {
       out << i;
    }
    return out;
}

Вам нужно создать файл и т. Д. В другом месте

myClass classObject; // Some instance of myClass you want to output
ofstream outStream;

outStream.open("emptyFile.txt", ios::app);

if (outStream.is_open()) {
    outStream << classObject; // You can output an instance of your class now
    outStream.close();
}
else throw "Unable to open file";

Вам также необходимо обновить объявление operator<< в заголовочном файле, чтобы оно возвращало ostream& вместо myClass&.Что вы точно делаете, так это перегружаете потоковый оператор для вашего класса.Поэтому, когда вы используете его с потоком, вызывается этот метод, и ваша реализация определяет, что происходит с потоком, когда вы хотите вывести экземпляр вашего класса.Таким образом, вы не должны открывать файл там.Просто выведите возвращаемое значение вашей функции-члена в поток и верните его.

РЕДАКТИРОВАТЬ: вам также придется изменить сигнатуру вашей функции-члена, чтобы передать вектор по ссылке (в противном случае вы заполняете копию).Ints не нужно передавать по ссылке.

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