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

Rozbicie unique_ptr na frazy

0 głosów
395 wizyt
pytanie zadane 28 marca 2021 w C i C++ przez kaminie318 Bywalec (2,070 p.)

Czy da się jakoś podzielić unque_ptr aby od razu nie przypisywać obiektu? Nie chcę dublować kodu w programie więc chciałbym zadeklarować go sobie przed if'ami, potem w zależności od użytkownika odpowiednio go przypisać.

void Team::addToTheTeam()
{
	int choice;
	cout << "Who would you like to add?(1.Player 2.Employee): "; cin >> choice;
	//czy da sie utowrzyć tu unique_ptr a dopiero potem go przypisać żeby wsk było widoczne poza blokiem kodu?
	unique_ptr<Person>wsk;
	if (choice == 1)
	{
		wsk(new Player);	//<-w ten sposób
	}
	else if (choice == 2)
	{
		unique_ptr<Person>wsk(new Employee);
	}
	else
	{
		cout << "Bad choice. You're going to menu..." << endl;
		return;
	}
	wsk->addPerson();
	//todo
}

Wiem, że zwykłymi wskaźnikami bym tak zrobił jednak wolę ich unikać gdyż nie chcę później szukać wycieków.

2 odpowiedzi

+2 głosów
odpowiedź 28 marca 2021 przez tangarr Mędrzec (155,140 p.)
wybrane 28 marca 2021 przez kaminie318
 
Najlepsza

Nie ma żadnego problemu. Wystarczy użyć funkcji reset.

unique_ptr<Klasa> wsk;
if (warunek) {
    wsk.reset(new Klasa());
}
else if (warunek2) {
    wsk.reset(new KlasaPotomna());
}
else {
    //error
}

 

komentarz 28 marca 2021 przez kaminie318 Bywalec (2,070 p.)

Dzięki, wiecie dlaczego podczas takiej deklaracji wektora wskaźników wyskakuje błąd o treści: "próba odwołania do usuniętej funkcji?"

vector <unique_ptr <Person>>persons;

 

komentarz 28 marca 2021 przez tangarr Mędrzec (155,140 p.)
Prawdopodobnie podczas dodawania nowego elementu do wektora używasz konstruktora kopiującego zamiast przenoszącego.
Dla pewności pokaż deklarację klasy Person oraz użycie wektora persons.
komentarz 28 marca 2021 przez kaminie318 Bywalec (2,070 p.)
Person.h

#pragma once
#include <iostream>

using namespace std;

class Person
{
public:
    int price = 0;
    string name;
    string surrname;
    int height = 0;
    int ratingOfThePerson = 0;

    virtual void addPerson();

    virtual void showPerson();

    virtual void readPerson(fstream& file);
};
 

Person.cpp

#include "Person.h"
#include <iostream>
#include <fstream>

using namespace std;

void Person::addPerson()
{
    cout << "What's the price?: "; cin >> this->price;
    cout << "What's the name?: "; cin >> this->name;
    cout << "What's the surrname?: "; cin >> this->surrname;
    cout << "Height?: "; cin >> this->height;
    cout << "What's the rating of the person?(1-10): "; cin >> this->ratingOfThePerson;
}

void Person:: showPerson()
{
    cout << "Price: " << this->price << endl;
    cout << "Name: " << this->name << endl;
    cout << "Surrname: " << this->surrname << endl;
    cout << "Height: " << this->height << endl;
    cout << "Rating: " << this->ratingOfThePerson << endl;
}

void Person::readPerson(fstream& file)
{
    cout << "Price: "; file >> this->price;
    cout << "Name: "; file >> this->name;
    cout << "Surrname: "; file >> this->surrname;
    cout << "Height: "; file >> this->height;
    cout << "Rating: "; file >> this->ratingOfThePerson;
}

 

Team.h

...

vector <unique_ptr <Person>>persons;

...

 

Team.cpp

void Team::addToTheTeamWsk()
{
    int choice;
    cout << "Who would you like to add?(1.Player 2.Employee): "; cin >> choice;
    unique_ptr<Person>wsk;
    if (choice == 1)
    {
        wsk.reset(new Player);
    }
    else if (choice == 2)
    {
        wsk.reset(new Employee);
    }
    else
    {
        cout << "Bad choice. You're going to menu..." << endl;
        return;
    }
    wsk->addPerson();
    persons.push_back(wsk);
}

void Team::showTeamWorkersWsk()
{
    if (persons.empty() == true)
    {
        cout << "There is no one in the team! You're going to menu..." << endl << endl;
        return;
    }
    for (auto it = persons.begin(); it < persons.end(); it++)
    {
        cout << "Number of player: " << numberOfPlayer++;
        (*it)->showPerson();
    }
}

 

komentarz 28 marca 2021 przez tangarr Mędrzec (155,140 p.)

Tak jak podejrzewałem.

W funkcji addToTheTeamWsk próbujesz wstawić kopię wskaźnika unique_ptr do wektora. Z definicji wskaźnik unique jest niekopiowalny, musisz go przenieść.

persons.push_back(std::move(wsk));

 

komentarz 28 marca 2021 przez kaminie318 Bywalec (2,070 p.)
Nadal to samo. Z tego co widzę to problem tkwi w deklaracji bo jak zakomentuje tą linię z deklaracją wektora wskaźników program się kompiluje.
0 głosów
odpowiedź 28 marca 2021 przez Kabuuz Bywalec (2,820 p.)
Jeśli chcesz przypisać później do unique_ptr to musisz użyć std::move + std::make_unique
1
komentarz 28 marca 2021 przez j23 Mędrzec (195,220 p.)

Nie musi używać std::move, jeśli przypisuje to, co zwraca std::make_unique.

Podobne pytania

+1 głos
2 odpowiedzi 1,108 wizyt
0 głosów
1 odpowiedź 481 wizyt
pytanie zadane 8 lutego 2022 w Java przez komboboost0 Użytkownik (570 p.)
+1 głos
0 odpowiedzi 463 wizyt
pytanie zadane 12 lutego 2021 w JavaScript przez yapyap Obywatel (1,730 p.)

93,733 zapytań

142,669 odpowiedzi

323,287 komentarzy

63,293 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...