zapis do pliku przez przeładowanie operatora << obiektem klasy

0

Witam,
Mam pewien problem.

Załóżny, że chcemy zapisać stan klasy (pola obiektu pewnej klasy) do pliku(data.txt) za pomocą operatora << ustawiając po jego lewej stronie obiekt klasy:

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

class klasa // klasa której obiekt chce "zapisać"
{
public:
	friend ostream& operator << (ostream& out, klasa& obj);
	friend ofstream& operator << (ofstream& out, klasa& obj);

	string zmienna1, zmienna2, zmienna3; // przykładowe dane
	klasa (string zm1, string zm2, string zm3) {zmienna1 = zm1; zmienna2 = zm2; zmienna3 = zm3;};
};

ostream& operator << (ostream& out, klasa& obj) // to przeciążenie operatora działa
{
	return out << obj.zmienna1 << endl << obj.zmienna2 << endl << obj.zmienna3 << endl ;
}

ofstream& operator << (ofstream& out, klasa& obj)  // tego kompilator(Visual Studio) nie kompiluje 
{
	return out << obj.zmienna1 << endl << obj.zmienna2 << endl << obj.zmienna3 << endl; // kompilator podkreśla "out"
}


int _tmain(int argc, _TCHAR* argv[])
{
	klasa obiekt("jakies", "dowolne", "dane");
	cout << obiekt;
	ofstream plik("data.txt");
	plik << obiekt;
	plik.close();

	system("PAUSE");
	return 0;
}

Nie wiem czemu nie udaje mi się w ten sposób zapisać do pliku.
Skoro moge wydrukować to na konsoli, czemu nie do pliku?

Pozdrawiam

0

Nie wiem dlaczego dokładnie to się nie kompiluje i nie chce mi się nad tym zastanawiać, ale przeciążenie dla ostream będzie działało też dla ofstream i jest to prawidłowy sposób rozwiązania tego problemu.

0

kompilator komunikuje błąd:

cannot convert from 'std::basic_ostream<_Elem,_Traits>' to 'std::ofstream &' with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]

0

Po prostu wykasuj ten drugi operator.;)
Klasa ofstream i tak dziedziczy po ostream.

0

Jak się zastanowiłem, to operator << jest przeciążony w <string> tylko dla zwracania ostream&. Nie możesz podpiąć referencji do klasy bazowej do referencji do klasy pochodnej. Przeciążanie << dla ofstream& jest bezsensowną duplikacją kodu, gdy już przeciążasz ostream&.

1 użytkowników online, w tym zalogowanych: 0, gości: 1