Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Tworzenie figur używając kompozycji

Ostatnio zmodyfikowano 2015-06-02 09:06
Autor Wiadomość
arek213
Temat założony przez niniejszego użytkownika
Tworzenie figur używając kompozycji
» 2015-05-30 19:52:04
Korzystając z kompozycji stworzyłem takie figury jak trójkąt i czworokąt. Teraz mam utworzyć nową klasę która będzie prywatną kolekcją(tablica,lista) figur - trójkąt i czworokątów.W tej klasie ma być metoda, która służy do dodawania nowych figur do kolekcji.Coś próbowałem ale nie działa. Jak ją mogę utworzyć ? Mój kod:

C/C++
#include <iostream>

using namespace std;

class Punkt
{
    int x, y;
   
public:
   
    Punkt()
    {
        x = y = 0;
    }
   
    Punkt( int x, int y )
    {
        this->x = x;
        this->y = y;
    }
   
    Punkt( const Punkt & p )
    {
        this->x = p.x;
        this->y = p.y;
    }
   
    void przesun( int dx, int dy )
    {
        x += dx;
        y += dy;
    }
   
    void wypisz()
    {
        cout << "(" << x << ", " << y << ")" << endl;
    }
};

class Linia
{
    Punkt * p1, * p2;
   
public:
   
    Linia()
    {
        p1 = new Punkt();
        p2 = new Punkt( 1, 1 );
    }
   
    Linia( Punkt & p1, Punkt & p2 )
    {
        this->p1 = new Punkt( p1 );
        this->p2 = new Punkt( p2 );
    }
   
    Linia( const Linia & l )
    {
        this->p1 = l.p1;
        this->p2 = l.p2;
    }
   
    void przesun( int dx, int dy )
    {
        p1->przesun( dx, dy );
        p2->przesun( dx, dy );
    }
   
    ~Linia()
    {
        delete p1;
        delete p2;
    }
};

class Trojkat
{
    Linia * l1, * l2, * l3;
   
public:
   
    Trojkat()
    {
        this->l1 = new Linia();
        this->l2 = new Linia();
        this->l3 = new Linia();
    }
   
    Trojkat( Punkt & a, Punkt & b, Punkt & c )
    {
        l1 = new Linia( a, b );
        l2 = new Linia( b, c );
        l3 = new Linia( c, a );
    }
   
    Trojkat( const Trojkat & trojkat )
    {
        this->l1 = trojkat.l1;
        this->l2 = trojkat.l2;
        this->l3 = trojkat.l3;
    }
   
    void przesun( int dx, int dy )
    {
        l1->przesun( dx, dy );
        l2->przesun( dx, dy );
        l3->przesun( dx, dy );
    }
   
    ~Trojkat()
    {
        delete l1;
        delete l2;
        delete l3;
    }
   
};

class Czworokat
{
    Linia * l1, * l2, * l3, * l4;
   
public:
   
    Czworokat()
    {
        this->l1 = new Linia();
        this->l2 = new Linia();
        this->l3 = new Linia();
        this->l4 = new Linia();
    }
   
    Czworokat( Punkt & a, Punkt & b, Punkt & c, Punkt & d )
    {
        this->l1 = new Linia( a, b );
        this->l2 = new Linia( b, c );
        this->l3 = new Linia( c, d );
        this->l4 = new Linia( d, a );
    }
   
    Czworokat( const Czworokat & czworokat )
    {
        this->l1 = czworokat.l1;
        this->l2 = czworokat.l2;
        this->l3 = czworokat.l3;
        this->l4 = czworokat.l4;
    }
   
    void przesun( int dx, int dy )
    {
        l1->przesun( dx, dy );
        l2->przesun( dx, dy );
        l3->przesun( dx, dy );
        l4->przesun( dx, dy );
    }
   
    ~Czworokat()
    {
        delete l1;
        delete l2;
        delete l3;
        delete l4;
    }
};

class Obraz
{
    Trojkat * trojkat = new Trojkat[ 20 ];
    int licznik = 0;
   
public:
   
    void DodajTrojkat( Trojkat trojkat )
    {
        trojkat[ licznik++ ] = trojkat;
    }
};
int main()
{
    Punkt * pierwszy = new Punkt( 1, 1 );
    Punkt * drugi = new Punkt( 2, 2 );
    Punkt * trzeci = new Punkt( 4, 8 );
    Punkt * czwarty = new Punkt( 15, 17 );
   
    Linia * l1 = new Linia( * pierwszy, * drugi );
    l1->przesun( 4, 4 );
   
    Trojkat * trojkat = new Trojkat( * pierwszy, * drugi, * trzeci );
   
    Czworokat * czworokat = new Czworokat( * pierwszy, * drugi, * trzeci, * czwarty );
   
    return 0;
}
P-132991
Monika90
» 2015-05-30 20:25:46
To już było
http://cpp0x.pl/forum/temat/​?id=10610

Konstruktor kopiujący w klasie Punkt jest zbędny. A w klasie Linia błędny, gdyby składowe tej klasy nie był wskaźnikami, to ani konstruktor kopiujący, ani operator przypisania nie byłby potrzebny.
P-132993
arek213
Temat założony przez niniejszego użytkownika
» 2015-05-30 20:29:17
Usunąłem konstruktor kopiujący z klasy Punkt. Dlaczego konstruktor kopiujący w klasie linia jest błędny ? A czy konstruktor domyślny w klasie Trójkąt i Czworokąt ma sens ? Czy dobrze w klasie Obraz zrobiłem kolekcje Trójkątów ?:
C/C++
#include <iostream>

using namespace std;

class Punkt
{
    int x, y;
   
public:
   
    Punkt()
    {
        x = y = 0;
    }
   
    Punkt( int x, int y )
    {
        this->x = x;
        this->y = y;
    }
   
    void przesun( int dx, int dy )
    {
        x += dx;
        y += dy;
    }
   
    void wypisz()
    {
        cout << "(" << x << ", " << y << ")" << endl;
    }
};

class Linia
{
    Punkt * p1, * p2;
   
public:
   
    Linia()
    {
        p1 = new Punkt();
        p2 = new Punkt( 1, 1 );
    }
   
    Linia( Punkt & p1, Punkt & p2 )
    {
        this->p1 = new Punkt( p1 );
        this->p2 = new Punkt( p2 );
    }
   
    Linia( const Linia & l )
    {
        this->p1 = l.p1;
        this->p2 = l.p2;
    }
   
    void przesun( int dx, int dy )
    {
        p1->przesun( dx, dy );
        p2->przesun( dx, dy );
    }
   
    ~Linia()
    {
        delete p1;
        delete p2;
    }
};

class Trojkat
{
    Linia * l1, * l2, * l3;
   
public:
   
    Trojkat()
    {
        this->l1 = new Linia();
        this->l2 = new Linia();
        this->l3 = new Linia();
    }
   
    Trojkat( Punkt & a, Punkt & b, Punkt & c )
    {
        l1 = new Linia( a, b );
        l2 = new Linia( b, c );
        l3 = new Linia( c, a );
    }
   
    Trojkat( const Trojkat & trojkat )
    {
        this->l1 = trojkat.l1;
        this->l2 = trojkat.l2;
        this->l3 = trojkat.l3;
    }
   
    void przesun( int dx, int dy )
    {
        l1->przesun( dx, dy );
        l2->przesun( dx, dy );
        l3->przesun( dx, dy );
    }
   
    ~Trojkat()
    {
        delete l1;
        delete l2;
        delete l3;
    }
   
};

class Czworokat
{
    Linia * l1, * l2, * l3, * l4;
   
public:
   
    Czworokat()
    {
        this->l1 = new Linia();
        this->l2 = new Linia();
        this->l3 = new Linia();
        this->l4 = new Linia();
    }
   
    Czworokat( Punkt & a, Punkt & b, Punkt & c, Punkt & d )
    {
        this->l1 = new Linia( a, b );
        this->l2 = new Linia( b, c );
        this->l3 = new Linia( c, d );
        this->l4 = new Linia( d, a );
    }
   
    Czworokat( const Czworokat & czworokat )
    {
        this->l1 = czworokat.l1;
        this->l2 = czworokat.l2;
        this->l3 = czworokat.l3;
        this->l4 = czworokat.l4;
    }
   
    void przesun( int dx, int dy )
    {
        l1->przesun( dx, dy );
        l2->przesun( dx, dy );
        l3->przesun( dx, dy );
        l4->przesun( dx, dy );
    }
   
    ~Czworokat()
    {
        delete l1;
        delete l2;
        delete l3;
        delete l4;
    }
};

class Obraz
{
    Trojkat * TablicaTrojkat = new Trojkat[ 20 ];
    int licznik = 0;
   
public:
   
    void DodajTrojkat( Trojkat trojkat )
    {
        TablicaTrojkat[ licznik++ ] = trojkat;
    }
};
int main()
{
    Punkt * pierwszy = new Punkt( 1, 1 );
    Punkt * drugi = new Punkt( 2, 2 );
    Punkt * trzeci = new Punkt( 4, 8 );
    Punkt * czwarty = new Punkt( 15, 17 );
   
    Linia * l1 = new Linia( * pierwszy, * drugi );
    l1->przesun( 4, 4 );
   
    Trojkat * trojkat = new Trojkat( * pierwszy, * drugi, * trzeci );
   
    Czworokat * czworokat = new Czworokat( * pierwszy, * drugi, * trzeci, * czwarty );
   
    return 0;
}
P-132994
pekfos
» 2015-05-31 13:56:08
Dlaczego konstruktor kopiujący w klasie linia jest błędny ?
Bo nie kopiuje.

A czy konstruktor domyślny w klasie Trójkąt i Czworokąt ma sens ?
To samo, co w linia. Dlaczego miałyby być dobre, skoro wyglądają identycznie? Niepotrzebnie używasz wskaźników i niepoprawnie się z nimi obchodzisz.
P-133015
arek213
Temat założony przez niniejszego użytkownika
» 2015-06-01 21:27:53
Mi się wydaję, że jest dobry, czemu jest zły ten konstruktor kopiujący ? Po za tym, że jest zły ?
P-133069
Monika90
» 2015-06-01 22:00:42
Powiedzmy, że tworzysz jeden obiekt klasy Linia za pomocą konstruktora domyślnego i drugi jako kopię tego pierwszego, następnie niszczysz obydwa. Co się wtedy stanie?

Żeby było jasne, chodzi o taki kod
C/C++
int main()
{
    Linia ln1;
    Linia ln2( ln1 );
}
P-133071
arek213
Temat założony przez niniejszego użytkownika
» 2015-06-02 07:23:22
HMM, Linia tworzy się w tym samym miejscu co poprzednia i zakrywając jednocześnie ją ?
P-133076
darko202
» 2015-06-02 09:06:41
>> Dlaczego konstruktor kopiujący w klasie linia jest błędny ?
C/C++
Linia( const Linia & l )
{
    this->p1 = l.p1; //przypisujemy wartość z kopiowanej linii , ale ponieważ jest to wskaźnik to faktycznie kopiujemy adres gdzie te wartości są przechowywane.
    nie tworzymy nowej zmiennej, ale operujemy na starej.
   
    this->p2 = l.p2; // jak wyżej
}

//teraz wyobraź sobie że wykonujemy operację na obu tych liniach

linia2.przesun( 5, 5 ); // tu zmieniamy tez wartości pod adresem linia1.p1 i linia1.p2
bo s ą pod tym samym adresem

linia1.przesun( - 3, - 3 ); //jak wyżej tyle że linia2.p1 i linia2.p2
po
delete linia1;
// dostęp do linia2 będzie zabroniony, a przynajmniej będziemy pisać gdzieś w pamięci
to oznacza że ww. konstruktor nie jest konstruktorem kopiującym






 
P-133078
« 1 »
  Strona 1 z 1