[C++] Klasa Vector2D,fcje wirtualne, iostream

0

Witam! Dostałem na laboratorium takie 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&)
}

Jestem trochę do tyłu z programowaniem i nie mam pojęcia co to jest za argument typu ostream&, istream&... Na jakiej zasadzie to ma działać? Mógłby ktoś trochę to wytłumaczyć? Ewentualnie pokazać jakiś przykładowy kod z czymś takim?

Pozdrawiam!

0

Powinno byc tak:

friend ostream& operator<<(ostream& strumien, Vector2D& w)
{
  strumien<<w.x<<" "<<w.y;
  return strumien;
}
friend istream& operator>>(istream& strumien, Vector2D& w)
{
  strumien>>w.x>>w.y;
  return strumien;
}

Wywolujesz to potem np. tak:

Vector2D wektorek;
cin>>wektorek; //podajesz z klawiatury 2 dane, x i y
cout<<wektorek;

Put i get będą dość podobne, tylko ze wywołania będą

Vector2D wektorek;
wektorek.Get(cin);
wektore.Put(cout);
0

tzn. w deklaracji w pliku nagłówkowym ma być :

friend ostream& operator<<(ostream& out, Vector2D vector)

a w definicji:

ostream& operator<<(ostream& out, Vector2D vector)
{
       out<<vector.x<<vector.y;
       return out;
}

jeśli tak, to w ogóle się nie kompiluje...
są błędy:
ISO C++ forbids declaration of ostream' with no type i ostream' is neither function nor member function; cannot be declared friend


już wiem..nie wpisałem using namespace std; 

ale nadal ta funkcja nie ma dostępu do zmiennych w sekcji protected..a powinna, bo jest zaprzyjaźniona, prawda?

`int Vector::x' is private 
`int Vector::y' is private
0

Po pierwsze nie umiesz nawet skopiować tego co napisałem. Ten & przy Vector2D w argumencie funkcji nie jest tam dla ozdoby.
Po drugie to znaczy ze napisałeś coś źle, pewnie deklaracje się nie zgadają czy coś. Pokaż kod, chyba że mam zgadywać...

0

Wielkie dzięki za pomoc!!! Zapomniałem tego ort! ale glupi jestem... jeszcze raz stokrotne dzięki!

0

Witam! mam juz to zrobione, ale teraz musze użyc w implementacji operatorów << i >> funkcji Get oraz Put, ktore musze zwracac wartosc void... i teraz nie wiem jak to zrobic... to wyglada mniej wiecej tak:

void Vector2D::Get(istream& in)
{
	cout<<"Podaj wspolrzedna X: ";
	in>>x;
	cout<<"Podaj wspolrzedna Y: ";
	in>>y;
}
void Vector2D::Put(ostream& out)
{
	out<<"Wspolrzedna X tego wektora to: "<<x; cout<<endl;
	out<<"Wspolrzedna Y tego wektora to: "<<y; cout<<endl;
}

ostream& operator<<(ostream& out, Vector2D& vector)
{
	out<<"Wspolrzedna X tego wektora to: "<<vector.x<<endl<<"Wspolrzedna Y tego wektora to: "<<vector.y;
	return out;
}

istream& operator>>(istream& in, Vector2D& vector)
{
  cout<<"Podaj wspolrzedna X: ";
  in>>vector.x;
  cout<<"Podaj wspolrzedna Y: ";
  in>>vector.y;
  return in;
}

Proszę o jakieś podpowiedzi
Pozdrawiam!

0

?

void Vector2D::Get(istream& in)
{
  cout<<"Podaj wspolrzedna X: ";
  in>>x;
  cout<<"Podaj wspolrzedna Y: ";
  in>>y;
}

istream& operator>>(istream& in, Vector2D& vector)
{
  vector.Get(in);
  return in;
}

Przy okazji :

  1. Nie używaj nazwy vector bo jak potem zechcesz używać <vector> to będzie problem z nazwą pewnie
  2. Referencja do obiektu w operator<< powinna być stała, zebyś obiekty const też mógł wypisać, a metoda Put powinna mieć dopisane const (czyli ze nie modyfikuje obiektu) z tego samego powodu.
0

ok! a jak przenieść definicje tych operatorów do klasy która dziedziczy do po klasie Vector2D (Vector3D)?
po prostu skopiować definicje i zrobić to samo dla klasy Vector3D czy jest na to jakiś inny sposób?

aa i musze jeszcze odpalic taki program:

{
Vector2D V2D;
Vector3D V3D;
cin>>V3D;
cout<<V3D;
Vector2D *pV2D = &V3D;
cout<<pV2D->GetLength();

getch();
}

tyle ze nie chce sie skompilowac wyskakuje komunikat:
'GetLength' : is not a member of 'Vector2D'...a przeciez jest...

0

Nie bardzo rozumiem. Definicje same się "przeniosą" bo je dziedziczysz. Oczywiscie skoro wektor3D dziedziczy z wektora2D to można użyć metody przeznaczonej dla wektora 2D na wektorze 3D, więc zamiast kopiować definicję (za użycie ctrl+c i ctrl+v powinien wybuchać monitor...) wywołaj w operatorach w klasie wektor3D operatory z klasy wektor2D.

0

tyle, że one się różnią nieco od siebie...nie powinny robić dokładnie tego samego...

0

Bzdury gadasz.
Wektor 3d składa sie z x,y,z
Wektor 2d składa sie z x,y

operatory dla wektora 2d wypisują i wczytują wartości do x i y
operatory dla wektora 3d powinny najpierw wywołać operator dla this zrzutowanego na wektor2d a potem wczytać / wypisać z

0

no Jasne:D wielkie dzięki:D
ale pojawił się ostatni problem...

musze to skompilowac:

Vector2D V2D;
Vector3D V3D;
cin>>V3D;
cout<<V3D;
Vector2D *pV2D = &V3D;
cout<<pV2D->GetLength();

ale wyskakuje, ze GetLenght() nie jest czlonkiem Vectora 2D...ale przeciez jest:

class Vector2D
{
	protected:
		double x, y;
	public:
		Vector2D();
		virtual double GetLenght();
		virtual void Get(istream& in);
		virtual void Put(ostream& out);
		friend ostream& operator<<(ostream& out, Vector2D& vector);
		friend istream& operator>>(istream& in, Vector2D& vector);
		~Vector2D();
};

więc nie wiem o co chozi :( jeszcze raz proszę o pomoc...

Ok, już wiem :) dziekuję za pomoc! Pozdrawiam!

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