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

question-closed [C++] Inteligentne wskaźniki kontra konstruktory

Object Storage Arubacloud
0 głosów
216 wizyt
pytanie zadane 7 kwietnia 2017 w C i C++ przez Dziura77 Obywatel (1,150 p.)
zamknięte 7 kwietnia 2017 przez Dziura77

Cześć. Walczę z tworzeniem klasy z listą inteligentnych wskaźników. Aktualnie wyszło mi coś takiego:

class Company
{
private:
	std::string name;
	double budget;
	std::list<std::unique_ptr<Employee>> employees;
public:
	Company(std::list<std::unique_ptr<Employee>>, const std::string & = "", double = 0.0);
};

(Employee to klasa abstrakcyjna, reszta klas po niej dziedziczy)

Company::Company(std::list<std::unique_ptr<Employee>> emp_l, const std::string & n, double b)
	: employees(std::move(emp_l)), name(n), budget(b)
{
}
//list of smart pointers
std::list<std::unique_ptr<Employee>> list;
list.emplace_back(new HourlyEmployee(he)); //he, se, man - obiekty zadeklarowane wcześniej
list.emplace_back(new SalariedEmployee(se));
list.emplace_back(new Manager(man));

Company SuperFirma(list, "Super firma", 5000000);
//Error C2280 attempting to reference a deleted function

Problem polega na tym, że nie wiem jak to powinno poprawnie wyglądać. Widoczne wyżej rozwiązanie jest nieprawidłowe i kompilator to wyrzuca. Pytanie brzmi: jak przesłać listę wskaźników unique_ptr do innej listy zamieszczonej w klasie?

komentarz zamknięcia: Problem rozwiązany (najlepsza odp.)
komentarz 7 kwietnia 2017 przez Dziura77 Obywatel (1,150 p.)

Dodam tylko, że na shared_ptr wszystko działa, ale chciałbym poznać sposób implementacji z unique_ptr.

1
komentarz 7 kwietnia 2017 przez criss Mędrzec (172,590 p.)
Na shared_ptr działa, bo pozwalają na kopiowanie przeciwnie do unique_ptr. Kompilator chciałby skopiować twoją lvalue liste skoro konstruktor Company przyjmuje przez wartość. Dlatego konieczne jest użycie std::move, żeby wymusić uruchomienie move constructora. Oczywiście musisz wtedy pamiętać, żeby nie używać więcej obiektu listy przekazanego do konstruktora.

1 odpowiedź

+1 głos
odpowiedź 7 kwietnia 2017 przez j23 Mędrzec (194,920 p.)
wybrane 7 kwietnia 2017 przez Dziura77
 
Najlepsza
Company SuperFirma(std::move(list), "Super firma", 5000000);

 

komentarz 7 kwietnia 2017 przez Dziura77 Obywatel (1,150 p.)

Dziękuję! smiley

Podobne pytania

+1 głos
1 odpowiedź 165 wizyt
pytanie zadane 6 czerwca 2019 w C i C++ przez amelia.cpp Obywatel (1,860 p.)
+1 głos
0 odpowiedzi 177 wizyt
pytanie zadane 7 stycznia 2016 w C i C++ przez 0xf Dyskutant (8,180 p.)
0 głosów
1 odpowiedź 857 wizyt

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 pasjonatów

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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...