Klasa wielobok ktora ma odwzorowac figure

0

Witam mam problem z kodem. Nie chodzi mi byście za mnie to zrobili tylko odpowiedzieli na 3 pytania bo nie wiem jak to ruszyc. (pytania na dole)
Musze sobie stworzyc klase wielobok ktora ma odwzorowywać wieloboczną figurę geometryczną na płaszczyźnie opisaną
zbiorem punktów. Klasa powinna dostarczać konstruktor domyślny oraz konstruktor umozliwiający utworzenie
zbioru punktów opisujących tę figurę.

Klasa punkt dziala bez problemu.

 
#include <iostream>
#include <cstdlib>
#include <cmath>

using namespace std;

class punkt {
    double x_, y_; //pola skladowe
    
    public:
        punkt (): x_(0),y_(0){} 
        punkt (double a1, double a2): x_(a1), y_(a2){} 
        double & x() {return x_;} 
        double & y() {return y_;} 
        const double & x() const {return x_;} 
        const double & y() const {return y_;} 
        double odleglosc (const punkt& r) const {return sqrt((x_-r.x_)*(x_-r.x_)+(y_-r.y_)*(y_-r.y_));} 
      
};

class wielobok {
    unsigned rozmiar;
    punkt* wsk;
    public:
        wielobok ():rozmiar(0), wsk(0) {}
        wielobok (const punkt* b, const punkt *e):rozmiar (e-b), wsk (rozmiar? new punkt [rozmiar]:0){
            for (unsigned i=0, i<rozmiar, i++)
            {
                wsk[i]=b[i];
                } //punkt* to typ

};

int main ()
{
    punkt p(2,3);
    cout << p.x() << ' ' << p.y() << '\n';
    p.x()=1; //bezposredni dostep do x
    p.y()=1;
    cout << p.x() << ' ' << p.y() << '\n';
    cout << p.odleglosc (punkt()) << '\n';; 
    punkt t[] = {punkt (0,1), punkt (0,0), punkt (1,0), punkt (1,1)};
    wielobok w1(t,t+4);

system("pause");
return 0;
}

1.Klase wielobok kolega mi przeslal (komp mi padl na zajeciach )
Wiem ze cos na wzor tego co mi znajomy przeslal mialo byc. Niestety kompletnie nie rozumiem listy inicjalizujacej do drugiego konstruktora w klasie wielobok :rozmiar (e-b), wsk (rozmiar? new punkt [rozmiar]:0) w szczegolnosci tego co zaczyna sie od wsk (rozmiar? new punkt [rozmiar]:0 domyslam sie ze cos mialo byc zwiazane z przydzieleniem dynamicznie pamieci.
2.O co chodzi z tym wsk[i]=b[i];. (domyslam sie zeby przekopiowac tablice do nowej) ale tutaj wsk to tylko wskaznik a nie tablica wskaznikow mogaca pokazac na obiekty typu punkt. Czyli ten zapis powinnien byc zly , bo najzwyczajniej nie ma tutaj miejsca by to przekopiowac?
3.W mainie natomiast nie rozumiem tego zapisu wielobok w1(t,t+4); Czy w tej linijce konstruktor inicjalizowany jest tymi elemtami tablicy t[0] i t[3] ? Czy elementami tablicy od [0] do [3] ?? (przeciez wielobok to beda jakies 4 pkty na plaszczyznie a nie dwa)

2

rozmiar (e - b)
operator- na dowolnych dwóch wskaźnikach zwraca informacje o odległości *b od *e w pamięci (nie w bajtach, ale bazując na rozmiarze tego na co wskazuje wskaźnik) - w ten sposób możesz policzyć, jak duża jest tablica (ile takich wskaźników mieści się od e do b). Chociaż sam napisałbym pewnie konstruktor, który przyjmuje wskaźnik na początek tablicy i ilość elementów.

wsk (rozmiar ? new punkt [rozmiar] : 0)
tutaj mamy jedyny operator ternarny (przyjmujący 3 argumenty) w C++ (i wielu innych językach).
Składnia jest prosta:
warunek ? co_zrobic_jesli_warunek_prawdziwy : co_jesli_nieprawdziwy co można przełożyć łatwo do ifa

if (warunek)
    co_zrobic_jesli_warunek_prawdziwy
else
    co_jesli_nieprawdziwy 

no ale ifa na liście inicjalizującej konstruktora nie napiszesz, nie? No. Poza tym ten operator ma kilka innych zalet jeszcze. Poza tym niezalecane jest używanie 0 jako NULL. Najnowszy standard każe używać nullptr.

wsk[i] = b[i];
to zwyczajne przekopiowanie jednej tablicy do drugiej. Zauważ, że miejsce na wsk zostało przydzielone: na liście inicjalizującej konstruktora. wsk (rozmiar ? new punkt [rozmiar] : 0) jeśli rozmiar > 0 to zostaje przydzielone miejsce, w przeciwnym przypadku (rozmiar == 0) pod wsk jest wpisywane nullptr. Poza tym - kolega nie zwalnia nigdzie pamięci przypisanej w konstruktorze, to bardzo poważny błąd.

wielobok w1 (t, t + 4);
tutaj przekazujesz do konstruktora dwa wskaźniki. Wszystko co pomiędzy nimi będzie wpisywane do tablicy punktów w konstruktorze wielobok.

Brzydki ten kod i nieładny i nie podoba mi się.

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