Я не могу l oop через вектор объектов при попытке перегрузить оператор вывода - PullRequest
0 голосов
/ 12 января 2020

У меня есть класс CPerson

class CPerson
{
private:
    string name;
    string egn;
public:
    CPerson() {};
    CPerson(string getname, string getegn)
    {
        name = getname;
        egn = getegn;
    }
bool operator < (const CPerson &obj)
    {
        ...
    }
    bool operator ==(const CPerson &obj)
    {
        ...
    }
    friend ostream& operator << (ostream& out, const CPerson &obj) //извеждане в поток - конзола
    {
        ...
    }
    friend istream& operator >> (istream& in, CPerson &obj) //четене от поток - конзола
    {
        ...
    }
    friend ofstream& operator <<(ofstream& out, const CPerson& obj) // извеждане в поток - файл
    {
        ...
    }
    friend ifstream& operator >>(ifstream& in, CPerson& obj) // четене от поток - файл
        {
...
        }

Я создал другой класс CCity, который имеет вектор объектов CPerson

class CCity
{
private:
    string city_name;
    vector <CPerson> people;
public:
    CCity() {};
    CCity(string filename)
    {
        string name, egn;
        ifstream file(filename);
        file >> city_name;
        while (file >> egn >> name)
        {
            people.push_back(CPerson(name, egn));
        }
    }
    friend ostream& operator <<(ostream& out, const CCity& obj)
    {
        vector<CPerson>::iterator iter;
        for (iter = people.begin(); iter != people.end(); iter++)
        {

        }
    }
};

Я пытаюсь перегрузить оператор вывода, чтобы я мог вывести мой вектор объектов, но я получаю ошибку «слева от .begin» должен иметь класс / структура / союз ». Я не вижу ничего плохого в моем коде. У меня есть и

1 Ответ

2 голосов
/ 12 января 2020

Сначала:

friend ostream& operator <<(ostream& out, const CCity& obj);

не определяет функцию-член! Объявление функции (оператора) как friend делает ее автономной, даже если она определена внутри класса. Так что внутри people объекта нет. Вам нужно сослаться на obj.people!

Тогда почему вы объявляете iter перед l oop? Вам нужен итератор по какой-либо причине после? Если нет, предпочитайте хранить его локально для l oop. Затем вы можете дополнительно разрешить вывод типа: for(auto iter = .... auto дополнительно покроет еще одну ошибку: obj является константой, поэтому obj.people также является константой. И перегрузка begin для постоянных объектов не вернет iterator, а const_iterator! Знайте, что есть две версии begin:

iterator begin();
const_iterator begin() const; // <- that one will be called on const objects!

Вы бы разбили l oop между? Если нет, вы также можете использовать диапазон, основанный на l oop: for(auto& person : obj.people). Снова тип person выводится, как мы явно указали auto как ссылку, тип будет Person const&.

Какой бы вариант вы ни выбрали, вы можете теперь вывести человека:

out << *iter;
out << person;

Предполагая, что они были опубликованы c, вы также можете получить доступ к атрибутам человека:

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