Почему я не могу создавать векторные объекты из текстового файла? - PullRequest
0 голосов
/ 24 апреля 2020
class CTurist
{
private:
    string name;
    string country;
    int age;
public:
    CTurist()
    {
        name = "";
        country = "";
        age = 0;
    }
    CTurist(string n, string c, int a)
    {
        name = n;
        country = c;
        age = a;
    }
    CTurist(const CTurist &t)
    {
        name = t.name;
        country = t.country;
        age = t.age;
    }
    string get_name()
    {
        return name;
    }
    string get_country()
    {
        return country;
    }
    int get_age()
    {
        return age;
    }
    void set_name(string n)
    {
        name = n;
    }
    void set_country(string c)
    {
        country = c;
    }
    void set_age(int a)
    {
        age = a;
    }
    bool operator<(CTurist& t)
    {
        return this->age < t.age;
    }
    friend istream& operator >> (istream& istr, CTurist& t)
    {
        istr >> t.name >> t.country >> t.age;
        return istr;
    }
    friend ostream& operator<<(ostream& ostr, const CTurist& t)
    {
        ostr << "\nName: " << t.name << ", country: " << t.country << ", age: " << t.age;
        return ostr;
    }
};

class CHotel
{
private:
    string hotel_name;
    int num_beds;
    double aver_price;
    vector<vector<CTurist>>v;
public:
    CHotel()
    {
        hotel_name = "";
        num_beds = 0;
        aver_price = 0;
    }
    CHotel(string hn, int nb, double ap, vector<vector<CTurist>>&vec)
    {
        hotel_name = hn;
        num_beds = nb;
        aver_price = ap;
        v = vec;
    }
    CHotel(const CHotel& h)
    {
        hotel_name = h.hotel_name;
        num_beds = h.num_beds;
        aver_price = h.aver_price;
        v = h.v;
    }
    string get_hotel_name()
    {
        return hotel_name;
    }
    int get_num_beds()
    {
        return num_beds;
    }
    double get_aver_price()
    {
        return aver_price;
    }
    vector<vector<CTurist>> get_vector() {
        return v;
    }
    void set_hotel_name(string hn)
    {
        hotel_name = hn;
    }
    void set_num_beds(int nb)
    {
        num_beds = nb;
    }
    void set_aver_price(double ap)
    {
        aver_price = ap;
    }
    bool operator<(CHotel& h)
    {
        return this->aver_price < h.aver_price;
    }
    friend istream& operator >> (istream& istr, CHotel& h)
    {
        int n;
        CTurist tur;
        istr >> h.hotel_name >> h.num_beds >> h.aver_price;
            for (int i = 0; i <= 11; i++) {
                istr >> n;
                for (int j = 0; j < n; i++) {
                    istr >> tur;
                    v[i].push_back(tur);
                }
            }
        return istr;
    }
    friend ostream& operator<<(ostream& ostr, const CHotel& h)
    {
        ostr << "Hotel name: " << h.hotel_name << ", number of beds: " << h.num_beds << ", average price: " << h.aver_price;
        for(const auto& it: h.v)
        {
            for (const auto& itr : it)
                ostr << itr;
        }
        return ostr;

    }
    void Output(ostream &ostr)
    {
        ostr << "\nHotel name: " << hotel_name << ", number of beds: " << num_beds << ", average price: " << aver_price;
        for (const auto& it : v)
        {
            for (const auto& itr : it)
                ostr << itr;
        }
    }
};

class CTurLine
{
    string m_line;
    vector<CHotel>m_hoteli;
public:
    CTurLine(string l, vector<CHotel>& vec)
    {
        m_line = l;
        m_hoteli = vec;
    }
    CTurLine(const string& filename)
    {
        ifstream ifile(filename);
        if (ifile.is_open())
        {
            ifile >> m_line;
            copy(istream_iterator<CHotel>(ifile), istream_iterator<CHotel>(), back_inserter(m_hoteli));
        }
    }
    friend ostream& operator<<(ostream& ostr, const CTurLine& t)
    {
        ostr << "Turline: " << t.m_line;
        for (const auto& it : t.m_hoteli)
        {
            ostr << it;
        }
        return ostr;
    }
    void Output(ostream &ostr)
    {
        ostr << m_line << endl;
        copy(m_hoteli.begin(), m_hoteli.end(), ostream_iterator<CHotel>(ostr, " "));
    }
};
int main()
{
    try {
        CTurLine tur("data.txt");
        tur.Output(cout);
    }
    catch (exception &e)                //catch(char *c) -AKO E SAMO THROW
    {                                  //{
        cout << e.what() << endl;     //cout<<c<<endl;
    }
}


Так что это мой школьный проект. У меня проблемы с чтением объектов (векторов векторов), и моя программа не запускается. Проблема в другом операторе ostream в классе CHotel.
Я выложу 2 картинки. На первом вы увидите мой текстовый файл, а на втором мой список ошибок.
Я пытался исправить это с помощью &, как показано в качестве предложения в списке ошибок, но это не помогло.
Может кто-нибудь сказать мне, как это исправить?
текстовый файл
error list
Албена
Магнолия 54 110
3
Иван Б.Г. 50
Мария БГ 40
Пешо PL 10
3
Валери Великобритания 15
Ивелина Великобритания 35
Гошо Пл 31
3
Джеймс США 52
Катрин 45 США
Пирс 41
3
Ралука Ро 60
Ким США 20
Уильям США 18
3
Ленка CZ 20
Мартин CZ 26
Адриан PL 65
3
Калина Ро 45
Моника С.П. 40
Джаред США 49
3
Даниэль BG 17
Teq BG 23
Даниэла BG 30
3
милен бг 43
валентин бг 43
андрей бг 21
3
адриана сша 19
гергана великобритания 21
василена бг 30
3
ванг бг 23
Venci BG 30
Грасиела BG 21
3
Тодорка BG 46
Станислав BG 34
Мартина BG 65
3
Конрад США 26
Борко Ро 45
джулия великобритания 31

1 Ответ

0 голосов
/ 24 апреля 2020

На ваш исходный вопрос вы получаете сообщение об ошибке, касающейся не * stati c члена, потому что в вашей функции

friend istream& operator >> (istream& istr, CHotel& h)

есть следующая строка:

v[i].push_back(tur);

Поскольку эта функция на самом деле не является частью класса CHotel, v таким образом недоступен. Он должен быть изменен на:

h.v[i].push_back(tur);

Как указано в комментариях, это приводит к ошибочному утверждению (в сборке отладки VS). Это UB, поскольку v на самом деле имеет нулевой размер. Во внешнем l oop вам нужно добавить новый vector к вектору v. Таким образом, в итоге у вас будет:

friend istream& operator >> (istream& istr, CHotel& h)
{
    int n;
    CTurist tur;
    istr >> h.hotel_name >> h.num_beds >> h.aver_price;
    for (int i = 0; i <= 11; i++) {
        istr >> n;
        h.v.push_back( {} );
        for (int j = 0; j < n; j++) {
            istr >> tur;
            h.v[i].push_back(tur);
        }
    }
    return istr;
}

PS: у вас также было i++ во внутренней части для l oop, что должно было быть j++

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...