Wrzucanie do vectora obiektów zawierających std::unique_ptr

0

Cześć. Mam klasę ze składową std::unique_ptr o nazwie towerSignature.

Deklaracja konstruktora wygląda tak:

towerSignature::towerSignature(std::unique_ptr<tower> newTower, const std::string desc) 

Mam też vector tych właśnie obiektów

 std::vector <towerSignature> towerSignatures; 

I chcę wrzucić do tego vectora obiekt ale wiadomo jest nonCopyable. I nie wiem jak mam napisać kod żeby wszystko działało.
Proszę o jakąś pomoc.

2

Jak masz move constructor to ją po prostu przenieś. http://en.cppreference.com/w/cpp/utility/move

1
vec.push_back(std::move(ptr));
0

Niestety nie działa z

std::move()
towerSignature t(std::make_unique<arcaneTower>(), "Simply magic \ntower, without \nspecial skills");
towerSignatures.push_back(std::move(t));
11

A masz move constructor?
Przydatna tabelka:
user image

0

Nie mam i nie mam zielonego pojęcia jak zrobić taki konstruktor xD

0

Jeśli trzymasz się rule of zero, to wystarczy dodać w definicji klasy:

towerSignature(towerSignature&&)=default;
towerSignature& operator=(towerSignature&&)=default;
0

Wow! Dzięki, działa elegancko tylko mógłbyś napisać coś więcej o tych 2 linijkach ?
I co to jest rule of zero ?

0

Rule of zero: http://en.cppreference.com/w/cpp/language/rule_of_three
domyślny konstruktor przenoszący, domyślny operator przypisania przenoszący

0

Dziękuję :)

0

Zobacz, mam kolejny problem.
Tak wygląda mój konstruktor klasy towerSignature:

towerSignature::towerSignature(std::unique_ptr<tower> newTower, const std::string desc)
{
	this->towerObject = std::move(newTower);

	if (!textureHaze.loadFromFile("Textury/haze.png"))
	{
		MessageBox(0, "Unable to load haze.png", 0, 0);
		return;
	}
	descriptionHaze.setTexture(textureHaze);

        /*
        ...
        */

} 

I w momencie takich instrukcji:

towerSignature t(std::make_unique<arcaneTower>(), "Simply magic \ntower, without \nspecial skills");
towerSignatures.push_back(std::move(t)); 

W t wywował się mój konstruktor ten co jest powyżej.
I w nim jest textura textureHaze wczytana a z momentem wyjście t poza {} obiekt ulega zniszczeniu a ten obiekt w vectorze dalej
wskazuje na towerSignature::textureHaze, która jest zniszczona i nie mam oczekiwanego efektu bo zwyczajnie zgubiłem texturę.
Co mam działać w takiej sytuacji ?

0

Nie wiem czym jest textureHaze, ale zapewne nie respektuje rule of zero (albo three, albo five).

0

textureHaze to jest textura, i robiąc instrukcje:

descriptionHaze.setTexture(textureHaze); 

Sprajt descriptionHaze ma wskaźnik na tą texturę i z momentem wyjścia t poza {} usuwa się textureHaze i sprajt descriptionHaze wskazuje na texturę, której nie ma.
Jestem pewny, że to ten problem bo kiedyś miałem podobnie i taki sam efekt.

Próbowałem tworzyć te konstruktory przenoszące ale nie umiem i nie wiem jak xD

0

Fajnie, że to tekstura. Nie widząc definicji nie jestem w stanie pomóc.

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

	sf::Texture textureHaze;
	sf::Sprite descriptionHaze;

	sf::Text description;

	unsigned int getProperCharacterSize(const size_t descSize);
	sf::Text cost;
	sf::Text power;
	sf::Text range;
	sf::Text speed;

	bool canShowDescription();
	bool canShowDescHaze;
	sf::Time timer;

	void makeAttributes();
	bool accesOpen;

public:
	towerSignature(std::unique_ptr<tower> newTower,const std::string desc);
	towerSignature(towerSignature&&) = default;
        towerSignature& operator=(towerSignature&&) = default;
	~towerSignature();
	void draw(sf::RenderTarget & target, sf::RenderStates states) const;
	void setDescription(const std::string desc);
	void setPosition(sf::Vector2f position);
	sf::Vector2f getTowerIconeSize();
	bool isClicked();
	std::unique_ptr<tower> &getTower();

	void update();
};
0

Ach, w takim razie domyślny konstruktor przenoszący nie da rady i musisz napisać własny.

0

Problem rozwiązany. Dzięki za pomoc ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1