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: #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; }
|
|
Monika90 |
» 2015-05-30 20:25:46 To już było http://cpp0x.pl/forum/temat/?id=10610Konstruktor 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. |
|
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 ?: #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; }
|
|
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. |
|
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 ? |
|
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 int main() { Linia ln1; Linia ln2( ln1 ); }
|
|
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ą ? |
|
darko202 |
» 2015-06-02 09:06:41 >> Dlaczego konstruktor kopiujący w klasie linia jest błędny ? Linia( const Linia & l ) { this->p1 = l.p1; nie tworzymy nowej zmiennej, ale operujemy na starej. this->p2 = l.p2; }
linia2.przesun( 5, 5 ); bo s ą pod tym samym adresem
linia1.przesun( - 3, - 3 ); po delete linia1;
to oznacza że ww. konstruktor nie jest konstruktorem kopiującym |
|
« 1 » |