Witam, mam do wykonania następujące zadanie:
1. Napisz klasę Vector2D zawierającą współrzędne wektora x i y. Klasa powinna zawierać wirtualne funkcje wprowadzania i wyprowadzania wartości współrzędnych (Put, Get) oraz obliczania długości wektora (GetLength). class Vector2D { double x,y; virtual double GetLength(); virtual void Put(ostream& out); virtual void Get(istream& in); friend operator<<(ostream&, Vector2D&) friend operator>>(istream&, Vector2D&) } 2. Napisz klasę pochodną Vector3D zawierającą dodatkową współrzędną z. Klasa powinna zawierać także swoje funkcje wprowadzania i wyprowadzania wartości - tym razem trzech, oraz obliczania długości wektora dla trzech współrzędnych. class Vector3D : public Vector2D { double z; double GetLength(); void Put(ostream& out); void Get(istream& in); } 3. Napisz definicje operatorów >> oraz << używając w nich odpowiednio funkcji wprowadzania i wyprowadzania z powyższych klas. ostream &operator<<(ostream& out, Vector2D&); istream &operator>>(istream& in, Vector2D&); UWAGA: można na początku utworzyć klasę abstrakcyjną Vector0D. 4. Uruchomić poniższy program: Vector2D V2D; Vector3D V3D; cin>>V3D; cout< Vector2D *pV2D = &V3D; cout<GetLength();
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ć.
nr47
(Sawyer47)
24 Kwiecień 2010 16:19
#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<< i operator>>.
A czy mógłbyś mi pokazać, jak to zrobić? Byłbym wdzięczny
nr47
(Sawyer47)
24 Kwiecień 2010 18:08
#4
Chyba widzisz, że Put i operator<< oraz Get 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
([alex])
25 Kwiecień 2010 12:46
#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]