Копирование с карты в список указателей - PullRequest
0 голосов
/ 01 мая 2018

У меня есть это интересное задание, где у меня есть переменная std::map из CTurist (предыдущий класс) и unsigned. Вот код:

class CTurist
{
protected:
    string tName;
    int age;

public:
    CTurist() {};

    CTurist(string name, int age2)
    {
        tName = name;
        age = age2;
    }


    bool operator<(const CTurist& e) const
    {
        return age < e.age;
    }

    friend ostream& operator<<(ostream& os, const CTurist&& e);
    friend ifstream& operator>>(ifstream& is, CTurist&& e);
};

class CHotel:public CTurist
{
protected:

    string hName;
    int stars;
    int beds;
    map<CTurist, unsigned> Turisti;

public:
    unsigned Sum = 0;

    CHotel(){};

    CHotel(string hName2, int zvezdi, int legla)
    {
        hName = hName;
        stars = zvezdi;
        beds = legla;
    }



    int Compare()
    {
        list<CTurist*> list;

        int br=0;
        CTurist vyzrast;
        map<CTurist, unsigned>::iterator it = Turisti.begin();
        while (it != Turisti.end())
        {
            if (it->first < vyzrast)
            {
                br++;
            }
            else
            {
                list.push_back(std::move(&it->first));
            }
        }
    }
};

Я знаю, что он довольно длинный, но я подумал, что лучше всего дать вам всю информацию.

Теперь функция int Compare() ВНУТРИ - это та, которая вызывает у меня проблемы.

Я должен проверить, не превышает ли возраст туристов параметр, который я назвал здесь vyzrast. Мы сравниваем age. Если оно внизу, оно довольно прямолинейно.

Если он выше, я должен добавить этих туристов в list<CTurist*>, иначе. к списку указателей. Если я сделаю список из объектов, а не указателей. Не повезло с этим, поэтому я ищу предложения, как это исправить.

1 Ответ

0 голосов
/ 01 мая 2018

Почему вы используете ссылки rvalue для ваших operator перегрузок? Вы должны использовать const CTurist & для operator<< и CTurist& для operator>>. И вы должны использовать std::istream для operator>>:

friend ostream& operator<<(ostream& os, const CTurist &e);
friend istream& operator>>(istream& is, CTurist &e);

Кроме того, Compare() вообще не имеет смысла использовать std::move() при заполнении std::list, так как он добавляет указатели, а не перемещает реальные объекты.

Compare() некорректно работает по нескольким причинам:

  1. it->first является действительным const CTurist объектом, но ваш std::list ожидает CTurist* указателей. std::map ключи const, поэтому &it->first - это указатель CTurist const * (неконстантный указатель на константный объект), а не CTurist* указатель (неконстантный указатель на неконстантный объект), как вы ожидаете .

  2. Ваш vyzrast объект не инициализирован. Вы вообще не присваиваете значение его agetName) члену, поэтому результат ваших сравнений не определен.

  3. Вы не увеличиваете свой it итератор на каждой итерации цикла, поэтому вы застряли в бесконечном цикле, если std::map не пусто.

Вместо этого попробуйте что-нибудь подобное:

int Compare()
{
    std::list<const CTurist *> clist;

    int br = 0;
    CTurist vyzrast("", SomeAgeValueHere);

    std::map<CTurist, unsigned>::iterator it = Turisti.begin();
    while (it != Turisti.end())
    {
        if (it->first < vyzrast)
        {
            br++;
        }
        else
        {
            clist.push_back(&it->first);
        }
        ++it;
    }

    // use clist as needed...

    return SomeValueHere;
}

Live Demo

...