Luk_Jab Temat założony przez niniejszego użytkownika |
Lista list obiektów dziedziczących po klasie abstrakcyjnej » 2013-04-28 16:59:59 Witam, mam problem z programem, który należy chyba do kanonu jeśli chodzi o zrozumienie programowania obiektowego. Otóż mam utworzyć abstrakcyjną klasę figura, która zawiera wierzchołki(zaimplementowałem to w formie wektora par x, y) i 3 metody - pokaz wierzchołki, licz pole i licz obwód. Metody liczPole() i liczObwod() są wirtualne, i odpowiednio zaimplementowane dla klas pochodnych(kwadrat, trójkąt itp). No i teraz dochodzę do właściwego problemu - w całym programie oprócz dziedziczenia mamy się jeszcze wykazać znajomością kontenerów. Jednym z zadań jest utworzenie listy obiektów dla każdej klasy pochodnej, oraz nadrzędnej listy list, która będzie zawierać listy obiektów danej klasy(tym sposobem będzie zawierać wszystkie utworzone obiekty). No i tutaj mam problem, podczas tworzenia listy muszę zadeklarować typ. Dla klas pochodnych nie sprawia to problemu, ale listy list nie umiem przeskoczyć. Polecenie list<list<figura>>lista_l na zdrowy chłopski rozum utworzy listę której elementami będą listy obiektów klasy figura, ale klasa figura jest abstrakcyjna(stąd też nie można utworzyć jej obiektów) i wypluwa błąd cannot instantiate abstract class . No i nie bardzo mam pomysł jakiego typu ma być ta lista list. Będę wdzięczny za nakierowanie na właściwą drogę. |
|
pekfos |
» 2013-04-28 17:05:17 std::list < std::list < figura *> > |
|
Luk_Jab Temat założony przez niniejszego użytkownika |
» 2013-04-29 14:50:23 Dzięki za pomoc, listę można tak utworzyć, ale mam problem z określeniem typów, i ze zrozumieniem tego co właściwie zrobiłeś w powyższej operacji. Gdy próbuję dodać nową listę do listy lista_l.push_back(lista_t ); otrzymuję komunikat: cannot convert parameter 1 from 'std::list<_Ty>' to 'std::list<_Ty> &&' . Jeśli dobrze rozumiem to && oznacza referencję na obiekt tymczasowy, i nie bardzo wiem co z tym zrobić :) |
|
pekfos |
» 2013-04-29 15:02:57 lista_l.push_back( std::move( lista_t ) );
Lub |
|
Luk_Jab Temat założony przez niniejszego użytkownika |
» 2013-04-29 17:51:06 lista_l.push_back( std::move( lista_t ) ); wypluwa identyczny błąd jak powyżej, lista_l.emplace_back(); działa. Ale nie bardzo wiem czy uzyskałem to co powinienem. Mam listę lista_l, na której 4 razy zastosowałem metodę emplace_back. W jaki sposób teraz dodawać kolejne elementy(które będą obiektami moich klas pochodnych) do tej listy? list < list < figura *>>::iterator it = lista_l.begin(); list < figura *>::iterator it2 =( * it ).begin(); * it2 = trojkat( tab[ 0 ], tab[ 1 ], tab[ 3 ] ); error C2440: '=' : cannot convert from 'trojkat' to 'figura *' Zakładając że pierwsza z list na liście to lista przeznaczona na trójkąty, to jak dodać do niej obiekt klasy trojkat, z 3 parametrowym konstruktorem? |
|
pekfos |
» 2013-04-29 18:37:04 ale mam problem z określeniem typów, i ze zrozumieniem tego co właściwie zrobiłeś w powyższej operacji. |
error C2440: '=' : cannot convert from 'trojkat' to 'figura *' |
Wiesz, co to wskaźnik? |
|
Luk_Jab Temat założony przez niniejszego użytkownika |
» 2013-04-29 20:04:44 Wiem, tylko mam niestety małą intuicję jeśli chodzi o ich używanie, do tego dochodzi praktycznie zerowa znajomość obsługi list.
EDIT: Udało mi się uruchomić program i w końcu działa jak trzeba. Listy obiektów utworzyłem w formie list<figura*>, każdorazowo element do takiej listy dodaję push_back'iem z odpowiednim konstruktorem. No i ogarnąłem nawigację po liście, wszystko gra i trąbi.
Dzięki wielkie za pomoc, bez Twoich uwag nic bym nie wymyślił :) No i podłapałem trochę do czego praktycznego można wykorzystać wskaźniki. |
|
« 1 » |