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

question-closed attempting to reference a deleted function przy std::vector::push_back()

Object Storage Arubacloud
0 głosów
463 wizyt
pytanie zadane 16 listopada 2016 w C i C++ przez Munvik Dyskutant (9,350 p.)
zamknięte 16 listopada 2016 przez Munvik

Cześć.

Pisałem elegancko kod dopóki nie pojawił się error C2280.

'towerSignature::towerSignature(const towerSignature &)': attempting to reference a deleted function  

 

Mam klasę:

class towerSignature :public sf::Drawable
{
	std::unique_ptr<tower> towerObject;

public:
	towerSignature(std::unique_ptr<tower> towerObject, const std::string desc);
	~towerSignature();
	void draw(sf::RenderTarget & target, sf::RenderStates states) const;
};

klasa tower jest abstrakcyjna.

I w klasie A mam:

std::vector <towerSignature> towerSignatures;

I dodatkowo w klasie A robię:

towerSignatures.push_back(towerSignature(std::make_unique<arcaneTower>(), "Simply magic tower"));

Gdzie klasa arcaneTower dziedziczy po tower

Wie ktoś gdzie leży problem ?

 

Dodam, że rzecz dzieję się przy 

towerSignatures.push_back(towerSignature(std::make_unique<arcaneTower>(), "Simply magic tower"));

komentarz zamknięcia: Zastosowanie shared_ptr okazało się rozwiązaniem problemu.

1 odpowiedź

+2 głosów
odpowiedź 16 listopada 2016 przez criss Mędrzec (172,590 p.)
edycja 16 listopada 2016 przez criss

Na początku musisz wiedzieć, że std::vector::push_back kopiuje przekazany obiekt.

towerSignature zawiera obiekt std::unique_ptr który jest niekopiowalny (co w sumie sugeruje nazwa). W związku z tym obiektów towerSignature również nie da się kopiować. Rozwiązaniem jest napisanie własnego copy constructora (i przy okazji copy assign operatora), albo pozbycie się unique_ptr.

Edit:

Od C++11 jest przeładowanie .push_back przyjmujące rvalue reference i nie wymagająca kopiowania (zamiast tego przenosi). Upewnij się czy masz włączony C++11 w kompilatorze - to powinno działać.

Jeszcze inna opcja to użycie emplace_back ale to też dostępne od C++11.

komentarz 16 listopada 2016 przez Munvik Dyskutant (9,350 p.)
Dobra dzięki kolego, problem rozwiązany :)
komentarz 16 listopada 2016 przez criss Mędrzec (172,590 p.)

Wyrzuca ci ten błąd?

'towerSignature::towerSignature(const towerSignature &): attempting to reference a deleted function  

Jakoś mi sie nie chce wierzyć ;_; anyway

Skoro konstruktor towerSignature przyjmuje unique_ptr, to zapewne go przypisuje do swojego pola towerObject czyli siłą rzeczy musi go skopiować. A już sobie powiedzieliśmy, że to niemożliwe. Dlatego konstruktor zapisz w tym stylu (użyj std::move)

 struct D
 {
   D(std::unique_ptr<int> pp, std::string ss) : p(std::move(pp)), s(ss) { }
   std::unique_ptr<int> p;
   std::string s;
 };

Teraz powinno nawet działać push_back. Jeśli nie, to nie wiem w czym problem.

Btw. łatwiej by było jak by twój konstruktor wyglądał tak:

 struct D
 {
   D(int* pp, std::string ss) : p(pp), s(ss) { }
   std::unique_ptr<int> p;
   std::string s;
 };

// ----------------

D d(new int(4), "hejka");

Poza tym - i tak wypadałoby napisać konstruktor kopiujący (po prostu tworzący nowy dynamicznie alokowany obiekt pod unique_ptr).

komentarz 16 listopada 2016 przez criss Mędrzec (172,590 p.)

Przy shared_ptr śmiga elegancko.

Wiem, ale chciałem rozwiązać problem a nie go obchodzić :P Poza tym - zauważ, że przy shared_ptr wszystkie kopie jakiegoś obiektu towerSignature korzystają z tego samego obiektu tower. 

komentarz 16 listopada 2016 przez Munvik Dyskutant (9,350 p.)

Tak, używałem przez std::move;

Miałem:

this->towerObject = std::move(towerObject);

w konstruktorze.

Nie znam się na smartPointerach dlatego tak wolno to idzie. Mimo wszystko dzięki za pomoc :)

komentarz 16 listopada 2016 przez criss Mędrzec (172,590 p.)
W takim razie nie mam pojęcia dlaczego push_back nie chce działać. Skompilowałem coś bardzo podobnego u siebie. Chodzi jak nalezy.

Podobne pytania

0 głosów
4 odpowiedzi 1,563 wizyt
pytanie zadane 12 sierpnia 2016 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 205 wizyt
0 głosów
1 odpowiedź 494 wizyt

92,550 zapytań

141,393 odpowiedzi

319,522 komentarzy

61,935 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!

...