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

Odpowiedz Nowy wątek
2010-04-23 22:37

Rejestracja: 10 lat temu

Ostatnio: 9 lat temu

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!

Pozostało 580 znaków

2010-04-23 22:59
Moderator

Rejestracja: 16 lat temu

Ostatnio: 8 minut temu

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);

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2010-04-23 23:57

Rejestracja: 10 lat temu

Ostatnio: 9 lat temu

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

Pozostało 580 znaków

2010-04-24 00:22
Moderator

Rejestracja: 16 lat temu

Ostatnio: 8 minut temu

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ć...


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2010-04-24 00:36

Rejestracja: 10 lat temu

Ostatnio: 9 lat temu

0

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

Pozostało 580 znaków

2010-04-25 23:55

Rejestracja: 10 lat temu

Ostatnio: 9 lat temu

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!

Pozostało 580 znaków

2010-04-26 00:14
Moderator

Rejestracja: 16 lat temu

Ostatnio: 8 minut temu

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.

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2010-04-26 00:31

Rejestracja: 10 lat temu

Ostatnio: 9 lat temu

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...

Pozostało 580 znaków

2010-04-26 00:39
Moderator

Rejestracja: 16 lat temu

Ostatnio: 8 minut temu

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.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2010-04-26 00:51

Rejestracja: 10 lat temu

Ostatnio: 9 lat temu

0

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

Pozostało 580 znaków

2010-04-26 00:58
Moderator

Rejestracja: 16 lat temu

Ostatnio: 8 minut temu

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


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

Odpowiedz

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