Klasa Vector - jak zadeklarować obiekt typu ostream, istream


(eureka 170) #1

Witam, mam do wykonania następujące zadanie:

Oto mój kod - jest on niedokończony i się jeszcze nie kompiluje

#ifndef VECTOR_H_INCLUDED

#define VECTOR_H_INCLUDED

#include 

using namespace std;

class Vector2D {

    protected:

	double x,y;

	virtual void Put(ostream& out) { out << "[" << x << "," << y << "]" << endl;}

	virtual void Get(istream& in) { in >> x >> y;}

	public:

    Vector2D();

	virtual double GetLength();

	friend ostream& operator<<(ostream&, Vector2D&);

	friend istream& operator>>(istream&, Vector2D&);

};



Vector2D::Vector2D()

{


    Get(istream & in);

}

ostream& operator<<(ostream &ekran , Vector2D&obiekt)

{

    ekran << "[" << obiekt.x << "," << obiekt.y << "]" << endl;

    return ekran;

}

istream& operator>>(istream&in, Vector2D&obiekt)

{

    cout << "Podaj wspolrzedna x" << endl;

    in >> obiekt.x;

    cout << "Podaj wspolrzedna y" << endl;

    in >> obiekt.y;

}

Moje pytanie jest, jak wywołać funkcję Get i Put w konstruktorze? Niestety nie potrafię tego zrobić, gdyż w tych funkcjach muszą być obiekty typu kolejno ostream i istream ( taka jest specyfikacja zadania), a nie wiem jak te obiekty i gdzie zadeklarować.


(Sawyer47) #2

Ale po co chcesz wywoływać te metody w konstruktorze, z tych poleceń które podałeś, jest to nieuzasadnione. Natomiast pkt. 3 sugeruje, że należy użyć Put i Get do implementacji operator<>.


(eureka 170) #3

A czy mógłbyś mi pokazać, jak to zrobić? Byłbym wdzięczny


(Sawyer47) #4

Chyba widzisz, że Put i operator<> wyglądają niemal identycznie – po co więc pisać 2 razy to samo, skoro z 1 funkcji można wywołać 2. W czym problem? W funkcjach od operatorów kod robiący to samo zastępujesz wywołaniem odpowiedniej metody na przekazanym obiekcie z argumentem będącym strumieniem.


([alex]) #5

dla twojego Vector2D:

Vector2D V;V.Get(cin);V.Put(cout);cinV;coutV;ifstream fin("c:\\dane_in.txt");finV; // lub V.Get(fin);fin.close();ofstream fout("c:\\dane_out.txt");foutV; // lub V.Put(fout);fout.close(); [/code]