• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Konwersja listy klas pochodnych na listę klas bazowych.

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
781 wizyt
pytanie zadane 20 marca 2019 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 31 marca 2019 przez Jakub 0

Witam, piszę pewien projekt, mam klasę bazową FlockingAlgorithm::FlockingObstacle oraz pochodną SeparationBall.

Taka konwersja jest możliwa:

FlockingAlgorithm::FlockingObstacle obj = *(obstaclesList.begin()); 

Natomiast ten zapis powoduje już błąd kompilacji:

std::list<FlockingAlgorithm::FlockingObstacle> lst(obstaclesList);

obstaclesList:

std::list<SeparationBall> obstaclesList; 

Występuje komunikat:

żadne wystąpienie konstruktora "std::list<_Ty, _Alloc>::list [gdzie _Ty=FlockingAlgorithm::FlockingObstacle, _Alloc=std::allocator<FlockingAlgorithm::FlockingObstacle>]" nie jest zgodne z listą argumentów   

Wiem że rzutowania mogę dokonywać dla każdego elementu listy z osobna, zależy mi jednak by zrobić to jedną instrukcją ponieważ lista obstaclesList jest przekazywana jak argument dla pewnej funkcji.

Dodam jeszcze że wcześniej obecna klasa pochodna nie dziedziczyła z niczego i konwersji dokonywałem tak:

std::list<FlockingObstacle> tempObstaclesList;
		std::transform(obstaclesList.begin(), obstaclesList.end(),
			std::front_insert_iterator<std::list<FlockingObstacle>>(tempObstaclesList),
			std::mem_fn(&SeparationBall::convertToFlockingObstacle));

to jednak jest chyba za mało wydajne za każdym obiegiem pętli wykonywać ten kod...

Będę wam bardzo wdzięczny za pomoc i pozdrawiam :)

komentarz zamknięcia: temat wyczerpany
komentarz 20 marca 2019 przez Ptaszor3 Użytkownik (900 p.)
Może przyczyną tego problemu jest to, że klasa szablonowa "list" z parametrem klasy podstawowej i ta sama klasa z klasą pochodną jako parametr to klasy które nie są ze sobą powiązane tak samo jak klasa dziedziczna z klasą podstawową? - czyste przypuszczenie.

1 odpowiedź

+1 głos
odpowiedź 20 marca 2019 przez adrian17 Mentor (351,100 p.)

 

to jednak jest chyba za mało wydajne za każdym obiegiem pętli wykonywać ten kod...

W Twoim przypadku nie da się inaczej. SeparationBall jest "większym" i (z punktu widzenia języka) nietrywialnie różnym typem od FlockingObstacle, więc nie da się tak po prostu "za darmo" traktować kontener jednego jak kontener drugiego. Również sam fakt, że przechowujesz same obiekty, sprawia, że nie masz innej możliwości niż "mało wydajnie" przepisywać ich zawartości.

Czemu przy czymś, co wygląda jak polimorfizm, "ucinasz" obiekty przechowując je same (zamiast wskaźników na klasę bazową/dziedziczącą)?

Boczne pytanie: dlaczego std::list zamiast std::vector?

komentarz 20 marca 2019 przez Jakub 0 Pasjonat (23,120 p.)
Dziękuje za odpowiedź, początkowo się rozpisałem o tym dlaczego to wszystko tak wygląda a nie inaczej, jednak pisząc to stwierdziłem że gdybym ja to czytał to i tak bym nic z tego nie zrozumiał ;). Do tego uzmysłowiłem sobie ważny fakt w moim projekcie, który praktycznie uniemożliwia mi zastosowanie dziedziczenia od FlockingObstacle. Cały projekt jest dość duży i sam się ze wszystkim pogubiłem , może przez to że zamiast zadowolić się działającym algorytmem grupującym to zachciało mi się z niego zrobić uniwersalną bibliotekę ( a zapomniałem o moich nikłych umiejętnościach ).

Powiem może jedynie dlaczego zastosowałem std::list... Mianowice często będzie tu stosowane dodawanie i usuwanie obiektów na dużą skalę ( a z tym ponoć lista radzi sobie lepiej ). Za to raczej nie będę potrzebował dostępu swobodnego do obiektów.

Najwyżej dam linka do repozytorium ( zaznaczam że dla tego projektu użyłem Gita po raz pierwszy, wykorzystuje go na razie tylko jako kopia zapasowa więc nie dorobiłem żadnych ładnych opisów itd... ( tak samo tymczasowo znajdują się tam wszystkie pliku projektu ) więc z góry przepraszam jeśli będzie on "raził  w oczy" :/ )

https://github.com/Jakub1010/Flocking-Algorithm-Project

* najważniejsze pliki to Flocking.h i Flocking.cpp

Podobne pytania

0 głosów
3 odpowiedzi 1,150 wizyt
0 głosów
1 odpowiedź 592 wizyt
0 głosów
1 odpowiedź 180 wizyt

93,187 zapytań

142,201 odpowiedzi

322,012 komentarzy

62,514 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2127p. - dia-Chann
  2. 2092p. - Łukasz Piwowar
  3. 2079p. - Łukasz Eckert
  4. 2037p. - Tomasz Bielak
  5. 2006p. - Michal Drewniak
  6. 2006p. - rucin93
  7. 2005p. - Łukasz Siedlecki
  8. 1964p. - CC PL
  9. 1946p. - Adrian Wieprzkowicz
  10. 1901p. - Mikbac
  11. 1744p. - rafalszastok
  12. 1734p. - Anonim 3619784
  13. 1586p. - Dawid128
  14. 1520p. - Marcin Putra
  15. 1480p. - ssynowiec
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...