Размер вектора возвращает 0 после заполнения цикла for - PullRequest
1 голос
/ 26 октября 2019

Я работаю над небольшим приложением на языке c ++, которое связано с тем, что лекторы и студенты объединяются в зависимости от класса, который они преподают / принимают.

У каждого лектора есть вектор студентов. Когда ученик посещает тот же класс, что и лектор, мы добавляем того же ученика к тому же лектору.

У меня есть 2 цикла for, которые проходят по всем лекторам и студентам, а затем сравнивают классы обоих, и, если они совпадают, добавьте этого студента к лектору.

После циклов я перебираю всех лекторов и получаю размеры каждого. Но возвращает 0 и должно вернуть 1. (Поскольку один студент соответствует классу для каждого лектора).

Lecturer.h

#pragma once
#include <iostream>
#include "Person.h"
#include "Student.h"
#include <vector>
#include <string>

using namespace std;

class Lecturer : public Person {

public:
    // Lecturer(string department, string specialization, string name, int age, char gender)
    //     : department(department), specialization(specialization), name(name), age(age), gender(gender) {}

    Lecturer() { }

    Lecturer(string department, string specialization, string name, int age, char gender, string uniClass){
        this->department = department;
        this->specialization =specialization;
        this->name = name;
        this->age = age;
        this->gender = gender;
        this->uniClass = uniClass;
    }

    // Class Methods
    void addStudent(Student student);

    // Setter Methods
    void setDepartment(string dprt);
    void setSpecialization(string splz);
    void setName(string nme);
    void setAge(int ag);
    void setGender(char g);

    // Getter Methods
    string getDepartment();
    string getSpecialization();
    string getUniClass();

    int getStudentsSize();
    vector<Student> getStudents();

private:
    string department;
    string specialization;
    vector<Student> students;
    string uniClass;
};

void Lecturer::addStudent(Student student)
{
    cout << student.getName() << endl;
    students.push_back(student);
}

int Lecturer::getStudentsSize()
{
    return students.size();
}

Student.h

#pragma once
#include <iostream>
#include "Person.h"
#include <string>

using namespace std;

class Student : public Person {

public:
    // Student(string major, string minor, int id, string name, int age, char gender)
    //     : major(major), minor(minor), id(id), name(name), age(age), gender(gender) {}

    Student() { }

    Student(string major, string minor, int id, string name, int age, char gender, string uniClass){
        this->major = major;
        this->minor = minor;
        this->id = id;
        this->name = name;
        this->age = age;
        this->gender = gender;
        this->uniClass = uniClass;
    }
    // Setter Methods
    void setMajor(string mjr);
    void setMinor(string mnr);
    void setId(int _id);
    void setName(string nme);
    void setAge(int ag);
    void setGender(char g);

    // Getter Methods
    string getMajor();
    string getMinor();
    int getId();
    string getUniClass();
    string getName();

private:
    string major;
    string minor;
    int id;
    string uniClass;
};

string Student::getUniClass()
{
    return uniClass;
}

main.cpp

#include <iostream>
#include <string>
#include "Person.h"
#include "Lecturer.h"
#include "Student.h"

int main()
{

    vector<Lecturer> lecturers;
    lecturers.push_back(Lecturer("Computing", "Advanced Programming", "John", 40, 'm', "AB101"));
    lecturers.push_back(Lecturer("Business", "Finance", "Dave", 42, 'm', "AB102"));
    lecturers.push_back(Lecturer("Science", "Physics", "Bill", 46, 'm', "AB103"));

    vector<Student> students;
    students.push_back(Student("Computer Science", "Maths", 123, "Mike", 20, 'm', "AB101"));
    students.push_back(Student("Business", "Economics", 142, "Jane", 21, 'f', "AB102"));
    students.push_back(Student("Engineering", "Physics", 151, "Mary", 19, 'f', "AB103"));

    for(Lecturer lecturer : lecturers)
    {
        for(Student student : students)
        {
        //cout << "Name: " << student.getUniClass() << endl;
        if (lecturer.getUniClass().compare(student.getUniClass()) == 0)
            {
                // ADDING A STUDENT THAT MATCHES THE CLASS
                lecturer.addStudent(student);
            }
        }
    }

    for(Lecturer lecturer : lecturers)
    {
        // EACH LECTURER'S STUDENTS SIZE IS 0 HERE (SHOULD BE 1)
        cout << lecturer.getStudentsSize() << endl;
    }
}

Ответы [ 2 ]

4 голосов
/ 26 октября 2019

Вы используете значения везде. Это означает, что копии.

Ваше первое изменение - итерация с использованием ссылок . Например:

for (Lecturer& lecturer : lecturers)
//           ^
1 голос
/ 26 октября 2019

Другие примечания, не относящиеся к тому, что в итоге было вашей настоящей ошибкой:

У каждого лектора есть вектор студентов.

Почему? Каждый лектор должен иметь (неупорядоченный) набор студентов. Студенты не существуют несколько раз параллельно. Кроме того, они не имеют неотъемлемого и релевантного порядка. На самом деле, лекторам нужен такой набор для каждого из курсов, которые они преподают.

Кроме того, почему вы предполагаете, что каждый студент посещает ровно один класс? ( смотрит на источник ) Ах! Теперь я понимаю.

  • Ваши «студенты» не являются студентами, они действительно являются записями о прохождении курса студентами.
  • Ваши «лекторы» не являются лекторамиЭто действительно записи курсов с информацией лектора.

Очень запутанно. Пожалуйста, исправьте это. Если вы используете соответствующие термины / имена и соответствующие структуры данных, не исключено, что вы обнаружите свою ошибку самостоятельно.

У меня есть 2 цикла for для всех лекторов и студентов изатем сравнивает классы обоих и, если они совпадают, добавьте этого ученика к лектору.

Две петли? Слишком глубоко, чтобы писать их самим в этом случае - как будто вы заново изобретаете колесо! Замените внутренний цикл вызовом std::copy_if. Это также может помочь обнаружить ошибки.

...