Разбор файла и необходимость добавления студентов в вектор структуры с использованием массива для имен студентов, специфичных для этой строки курса.

В моем файле course.h:

struct Course {
    std::string name;
    int enrollment;
    int maxEnrollment;

    std::string* students; ///< array of student names

    Course(std::string courseName, int maxEnrollmentPermitted);

    bool enroll(std::string studentName);

    void print(std::ostream& output);
};

В моем файле course.cpp:

bool Course::enroll(std::string studentName) {
    this->students = new std::string[studentName];
    if (this->enrollment < this->maxEnrollment) {
        this->enrollment++;
        return true;
    }
    else {
        return false;

В моем исходном файле:

void processEnrollmentRequests(istream& enrollmentRequestsFile, vector<Course>& courses) {
    // Read the requests, one at a time, serving each one
    string courseName;
    enrollmentRequestsFile >> courseName;

    while (enrollmentRequestsFile) {
        enrollmentRequestsFile >> ws;
        string studentName;
        getline(enrollmentRequestsFile, studentName);

        int pos = search(courses, courseName);
        if (pos >= 0) {
            // Found a matching course
            bool enrolled = courses[pos].enroll(studentName);
            if (enrolled) {
                cout << studentName << " has enrolled in " << courseName << endl;
            }
            else {
                // course is full
                cout << studentName << " cannot enroll in " << courseName << endl;
            }
        }
        else {
            // course does not exist
            cout << studentName << " cannot enroll in " << courseName << endl;
        }
        enrollmentRequestsFile >> courseName;
    }
}
        }
    }

Я не могу добавить собранное имя studentName в массив, используя this->students = new std::string[studentName]. Получение сообщения об ошибке must have integral or enumeration type.

c++
0
pstatix 31 Мар 2017 в 00:28

2 ответа

Лучший ответ

new SomeThing[size] используется для объявления массива. Нет смысла использовать строку в качестве размера.

Предполагая, что размер students ограничен maxEnrollment, вы можете использовать это:

if (this->enrollment < this->maxEnrollment) {
    this->students[this->enrollment++] = studentName;
    return true;
}
else {
    return false;
1
Xiaoy312 30 Мар 2017 в 21:42

Для полноты, распределение students не единственная проблема. Учитывая, что в опубликованном вами коде также используется std::vector<Course>, а Course не следует правилу 3, использование его в std::vector может привести к повреждению памяти, утечкам и т. Д.

Учитывая, что вы заявляете, что students должен оставаться указателем, полное исправление состоит в том, чтобы написать Course следующим образом:

#include <string>
#include <algorithm>

struct Course {
    std::string name;
    int enrollment;
    int maxEnrollment;
    std::string* students; ///< array of student names
    Course(std::string courseName, int maxEnrollmentPermitted);
    bool enroll(std::string studentName);
    void print(std::ostream& output);
    Course(const Course& rhs);
    Course& operator =(const Course& rhs);
    ~Course();
};

Course::Course(const Course& rhs) : name(rhs.name),  
                                    enrollment(rhs.enrollment),  
                                    maxEnrollment(rhs.maxEnrollment),
                                    students(new std::string[rhs.maxEnrollment])
{
   for (int i = 0; i < maxEnrollment; ++i)
      students[i] = rhs.students[i];
}

Course& Course::operator= (const Course& rhs)
{
   Course temp(rhs);
   std::swap(temp.students, students);
   std::swap(temp.maxEnrollment, maxEnrollment);
   std::swap(temp.enrollment, enrollment);
   std::swap(temp.name, name);
   return *this;
}

Course::~Course() { delete [] students; }

Course::Course(std::string courseName, int maxEnrollmentPermitted) : 
               name(courseName), 
               enrollment(0),
               maxEnrollment(maxEnrollmentPermitted), 
               students(new std::string[maxEnrollmentPermitted])    
{}

Почему весь этот код? Ну, в коде, который вы разместили в своем вопросе, вы используете std::vector<Course>. Класс Course в том виде, как он написан, нельзя безопасно использовать в векторе, поскольку Course имеет неверную семантику копирования. Таким образом, ваша ошибка может быть связана с кодом, который вы заявили, не ваш (vector<Course>).

Корректировки Course выше теперь делают Course безопасным для использования в векторе, так как семантика копирования (конструктор копирования, оператор присваивания и деструктор) теперь реализована для обработки динамически выделяемого {{X2} } участник.

Обратите внимание, что абсолютно ни один из этого кода не понадобился бы, если бы students были просто std::vector<std::string> вместо std::string *.

Для большего чтения:

Какое правило 3?

Что такое идиома копирования / обмена?

0
Community 23 Май 2017 в 11:46