Vector.erase () не работает для вектора классов - PullRequest
0 голосов
/ 29 мая 2020

Я пишу код для экзамена и сталкиваюсь с одной проблемой. Я сделал пропуск в тренажерный зал, у которого есть дата истечения срока действия (int waznos c), цена пропуска (float cena) и имя его владельца (string dane). В нем также есть услуги (char uslugi), где 0 - это базовая c, 1 - с бесплатными душевыми, а 2 - это VIP-комната (это просто пример кода для моего экзамена).

Вот определение класса ( комментарии находятся в poli sh):

class Karnet
{
    int waznosc; //ilosc dni
    char uslugi; //0 - podstawowy, 1 - prysznic, 2 - sala VIP
    float cena = ((int)uslugi - 47) * waznosc; //ilosc dni * pakiet uslug, np. podstawowy na miesiac to 30 * 1, a z sala VIP na 3 miesiace to 90 * 3 = 270
    string dane; //imie_nazwisko kupujacego
public:

    Karnet() //podstawowy konstruktor
    {
        cout << "this: " << this;
        waznosc = 0;
        uslugi = '0';
        cena = 0;
        dane = "Lorem ipsum";
    }
    Karnet(int waznosc, char uslugi, string dane) //konstruktor z parametrami
    {
        this->waznosc = waznosc;
        this->uslugi = uslugi;
        this->dane = dane;
    }

    void wypisz()
    {
        cout << "Karnet: ";
        switch (uslugi)
        {
        case '0':
        {
            cout << "Podstawowy dostep do silowni, ";
        }
        case '1':
        {
            cout << "Pakiet silownia + prysznice, ";
        }
        case '2':
        {
            cout << "Luksusowy pakiet ze specjalna sala VIP, ";
        }
        default:
        {
            cout << "Blad."; //nie powinien nigdy default wystapic
        }
        }
        cout << "wazny " << waznosc << " dni, koszt " << cena << " zl." << endl;
    }
    void wpisz()
    {
        cout << "Wybierz pakiet uslug: \n0 - podstawowy\n1 - darmowe prysznice\n2 - specjalna sala vip";
        {
            char temp{};
            do
            {
                cin >> temp;
                if (!((int)temp > 47 & (int)temp < 51)) cout << endl << "Prosze wpisac cyfre odpowiadajaca pakietowi uslug...";
            } while (!((int)temp > 47 & (int)temp < 51));
            this->uslugi = temp;
        }
        cout << endl << "Podaj ilosc dni, na ktora chcesz wykupic karnet: ";
        cin >> this->waznosc;
        cout << endl << "Podaj swoje imie i nazwisko: ";
        cin >> this->dane;
    }
    void przedluz(int oile)
    {
        cout << "Przedluzenie waznosci o " << oile << " dni bedzie kosztowac " << oile * ((int)this->uslugi - 47) << ", kontynuowac? (t/n) ";
        char temp{};
        if (temp != 't') return;
        this->waznosc += oile;
    }
    friend bool operator==(const Karnet& lhs, const Karnet& rhs)
    {
        if (lhs.cena != rhs.cena) return false;
        if (!(lhs.dane._Equal(rhs.dane))) return false;
        if (lhs.uslugi != rhs.uslugi) return false;
        if (lhs.waznosc != rhs.waznosc) return false;
        return true;
    }
};`

Я также создал класс, который в основном является вектором моих классов Ka rnet. Я пытаюсь сделать функцию void для удаления одного ka rnet, но стирание выдает ошибку:

no instance of overloaded function "std::vector<_Ty, _Alloc>::erase [with _Ty=Karnet, _Alloc=std::allocator<Karnet>]" matches the argument list

Как хороший программист, я много часов гуглил , но безуспешно. Вот определение гимнастического класса (silownia)

 class silownia
{
    vector <Karnet> Stali_Klienci;
public:
    void dodaj(Karnet karnet)
    {
        Stali_Klienci.push_back(karnet);
    }
    void usun(Karnet karnet)
    {
        for (int i = 0; i < Stali_Klienci.size(); i++)
        {
            if (Stali_Klienci[i] == karnet) Stali_Klienci.erase(i);
        }
    }
};

void usun - это функция удаления, при которой я получаю сообщение об ошибке. Скажите, нужно ли мне переводить какие-либо комментарии, но они изучают комментарии, а не комментарии о том, что делает алгоритм. У меня есть вся программа, все, что мне нужно, это исправить эту часть.

Ответы [ 2 ]

1 голос
/ 29 мая 2020

std::vector::erase принимает итератор , а не индекс в качестве аргумента.

Stali_Klienci.erase(Stali_Klienci.begin() + i);

- разумный прием. Stali_Klienci.begin() - итератор для первого элемента, + i увеличивает итератор до i th элемента.

Если вы хотите удалить каждый элемент из std::vector затем clear делает это за один вызов.

0 голосов
/ 29 мая 2020

Вы должны прочитать erase () do c сначала: erase() ожидает итератор

Затем что-то вроде этого должно выполнить задание:

for (auto it = Stali_Klienci.begin(); it != Stali_Klienci.end(); ) 
{
   if (*it == karnet) {
        it = c.erase(it);
   } else {
        ++it;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...