Элемент доступа вектора - PullRequest
2 голосов
/ 30 марта 2020

У меня есть класс Student:

class Student {
private:
    unsigned int id;
    string name;
    vector<int> grades;
public:
    Student(unsigned int id, string name, vector<int> grades);;
    virtual ~Student() {}

    unsigned int getId() { return this->id; }
    string getName() { return this->name; }
    int getGradesAmount() { return this->grades.size(); }
    vector<int> getGrades() { return this->grades; }
    int getGrade(int i) { return this->grades[i]; }

    unsigned int getCoef()
    {
        unsigned int coef = 1;
        for (int i = 0; i < this->grades.size(); i++) { coef *= this->grades[i]; }
        return coef;
    }

    int getNameCoef() { return this->getName().size() % 2; }

    ostringstream getInfo()
    {
        ostringstream info;
        info << "ID: " << getId() << ".\n";
        info << "Name: " << getName() << ".\n";
        info << "Amount of grades: " << getGradesAmount() << ".\n";
        info << "Grades:";
        for (int i = 0; i < getGradesAmount(); i++)
            info << " " << getGrade(i);
        info << "\nProduct of grades: " << getCoef() << ".\n";
        info << "Is surname has odd number of symbols (0 = no / 1 = yes): " << getNameCoef() << ".\n";
        return info;
    }
};

Student::Student(unsigned int id, string name, vector<int> grades)
{
    this->id = id; this->name = name; this->grades = grades;
}

И класс Group:

class Group : public Student {
protected:
    int size = 0;
    vector<Student> group;
public:
    Group() : Student(getId(), getName(), getGrades()) {}

    void addStudent(Student student)
    {
        if (student.getNameCoef() == 1)
        {
            if (this->group.size() > 0)
            {
                for (int i = 0; i < this->group.size(); i++)
                {
                    if (student.getCoef() > group[i].getCoef())
                    {
                        this->group.insert(this->group.begin() + i, student);
                        this->size = this->size + 1;
                        return;
                    }
                }
            }

            cout << "\nAdded to start";
            this->group.push_back(student);
            this->size = this->size + 1;
        }
    }
};

В группе я пытаюсь перегрузить << для создания группы << cout. Итак, я добавил это в группу: </p>

friend ostream& operator<<(ostream& out, const Group& group) { // overloaded operator of output
        out << "\nThere are " << group.size << " students in the group.\n";
        for (int i = 0; i < group.size; i++)
        {
            out << "Student # " << i + 1 << ":\n";
            out << group[i].getInfo();
        }

        return out;
    }

Но у меня есть эта ошибка:

error C2676: binary '[': 'const Group' does not define this operator or a conversion to a type acceptable to the predefined operator

Итак, я погуглил любые [] перегруженные операторы для вектора, но не сделал найти что-нибудь, что работает для меня. Я также пытался копировать конструктор, но это не помогло мне. Как использовать group [i] .getInfo ()? Или, может быть, есть несколько других способов получить доступ к этому. Таким образом, группа [i] должна быть объектом Student.

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Есть несколько проблем с вашим кодом (см. Комментарии), но одна из них, о которой вы спрашиваете, связана с этой строкой:

out << group[i].getInfo();

Как упоминал ДжонФайло, group - это Group объект, а не std::vector. Если вы хотите получить доступ к std::vector group в классе Group, вам потребуется group.group:

out << group.group[i].getInfo();

Это решит эту проблему , но это только Справедливо предупредить вас, что вы скоро поразите других. Я рекомендую прочитать комментарии к вашему вопросу и выяснить, как их исправить.


Здесь стоит отметить, что одна из причин, по которой вы видите это, - вы, возможно, не понимаете, что operator<<() не является функцией-членом Group. То есть, даже если вы определите это встроенным образом так:

class Group : public Student {
    //...
    friend ostream& operator<<(ostream& out, const Group& group) { // overloaded operator of output
            out << "\nThere are " << group.size << " students in the group.\n";
            for (int i = 0; i < group.size; i++)
            {
                out << "Student # " << i + 1 << ":\n";
                out << group[i].getInfo();
            }

            return out;
        }
};

Может показаться, что он является членом Group, но на самом деле это не так. Это внешняя friend функция. На самом деле это не часть Group. Это означает, что вы не можете получить доступ к членам данных напрямую. Например,

this->size

потерпит неудачу, потому что, опять же, на самом деле это не функция-член.

Если вы хотите получить доступ к элементам данных Group, вам нужно получить к ним доступ через экземпляр, который вы передали (т. е. group:

group.size

Обратите внимание, что это означает, что когда вы делаете что-то вроде group.size, вы фактически получаете элемент данных Group::size, а не size() от std::vector.

1 голос
/ 30 марта 2020

Похоже, вы путаете group, который имеет тип Group, с его членом, который также вводит в заблуждение и называется group.

Либо вы предоставляете Group::operator[], либо вы изменяете operator<< на

friend ostream& operator<<(ostream& out, const Group& group) { // overloaded operator of output
        auto& vect = group.group;
        out << "\nThere are " << vect.size() << " students in the group.\n";
        for (int i = 0; i < vect.size(); i++)
        {
            out << "Student # " << i + 1 << ":\n";
            out << vect[i].getInfo();
        }

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