2013-05-14 1 views
3

Я учитель в независимой школе-интернате и пытаюсь написать программу на C++, которая будет случайным образом размещать студентов за столами в нашем столовом зале, чтобы они сидели с разными учащимися и с разными сотрудниками каждый неделю. В идеале, за определенный период они не будут сидеть за одним и тем же столом дважды и с максимально возможным количеством разных учеников. Я создал эту программу на Python, и она отлично работает (ну, довольно хорошо). По разным причинам я пытаюсь перенести это на C++ (который я вообще не знаю), поэтому я могу передать его на посадку. Студенты и сотрудники (а также возможности таблиц) считываются из текстовых файлов. Я создал два пользовательских класса, один для студентов и один для таблиц, для обработки данных. Вот файлы заголовков два класса:Проблема с классом C++

Table.h

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

using namespace std; 

class Table 
{ 
    // Private class variables 
    string staff; 
    int numSeats; 
    vector<Student> seating; 
public: 
    Table(); // Default constructor 
    Table(string s, int n); 
    Table(const Table& that) : staff(that.staff), numSeats(that.numSeats) 
    { 
    } 
    // Copy Constructor 
    Table& operator=(const Table& that) 
    { 
     staff = that.staff; 
     numSeats = that.numSeats; 
     return *this; 
    } 
    int getNumSeats(); 
    string getStaffName(); 
    void addStudent(Student student); 
    void removeStudent(Student student); 
    void clearStudents(); 
    vector<Student> getTableSeating(); 
    int getRemainingSeats(); 
    ~Table(void); 
}; 

Вот класс студент файл:

#pragma once 
#include <iostream> 
#include <vector> 

using namespace std; 

class Student 
{ 
    string name; 
    string country; 
    vector<int> tablesSatAt; 
public: 
    Student(string n, string c); 
    Student(); 
    Student(const Student& that) : name(that.name), country(that.country) 
    { 
    } 
    Student& operator=(const Student& that) 
    { 
     name = that.name; 
     country = that.country; 
     return *this; 
    } 
    string getName(); 
    string getCountry(); 
    void addTable(int tableNumber); 
    void removeTable(int tableNumber); 
    bool satAtTable(int tableNumber); 
    friend bool operator==(Student s1, Student s2); 
    friend bool operator!=(Student s1, Student s2); 
    ~Student(void); 
}; 

bool operator==(Student s1, Student s2); 
bool operator!=(Student s1, Student s2); 

Вот функция рекурсии, которая делает тяжелую работу:

bool seatRecursive(vector<Student> &tempStudents, vector<Table> &tempTables) 
{ 
    if (tempStudents.size() == 0) return true; //base case 

    Student nextStudent = randomSelect(tempStudents); 
    for (vector<int>::size_type i=0; i<tempTables.size(); i++) 
    { 
     if (tempTables[i].getRemainingSeats() > 0 && !nextStudent.satAtTable(i)) 
     { 
      addStudentToTable(nextStudent, tempTables, i); 
      if (seatRecursive(tempStudents, tempTables)) return true; 
      else 
      { 
       removeStudentFromTable(nextStudent, tempTables, i); 
       tempStudents.push_back(nextStudent); 
      } 
     } 
    } 
    return false; 
} 

Большая часть этих работ. Когда я запускаю программу, я получаю текстовый файл с 10 неделями сидения, но все посадочные места для стола одинаковы. то есть, если я являюсь конкретным сотрудником, у меня есть те же дети, которые сидят за моим столом в течение всех 10 недель. У меня есть вектор ints, который должен хранить номера таблиц, которые студент сидел во времени. При отладке я замечаю, что эти номера таблиц НЕ хранятся в этом векторе, они всегда пусты. Моя проблема в том, что я не могу понять, почему это происходит. Это потому, что я передаю векторы по ссылке? Связано ли это с указателями, хотя я не декларирую явно указатели?

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

Brian

+7

священная стена текста, каков ваш вопрос? – wich

+1

какой код называет seatRecursive? что внутри addStudentToTable? – Sergi0

+0

@wich, он хочет знать, почему «таблица истории» ученика не хранится. Его отладка показывает, что его вектор 'vector tablesSatAt' не обновляется. –

ответ

1

Я вижу, что обе копии конструкторов (и конструкторы уступки) Student и Table класса забыть о копировании STL векторов, содержащихся (vector<Student> seating и vector<int> tablesSatAt). Поскольку вы перегружаете эти конструкторы, вы должны скопировать их через конструктор копирования vector, поскольку это неявно сделано.

Не копируя их, каждый раз, когда Student или Table перемещается вокруг вектора (или назначается временному), внутренний вектор просто отбрасывается для нового объекта.

Как указано в комментарии Useless в этом случае, вам не нужно объявлять их, так как rule of three не применяется: вам не нужен деструктор, поэтому, возможно, вам не понадобятся два конструктора копирования.

Примечание: то, что вы называете конструктором копирования в своем комментарии, является конструктором назначения копирования. Один из них является реальным конструктором копирования.

+6

Или просто не пишите конструктор копирования вообще. Созданный компилятором будет делать это отлично. – Useless

+0

Странно то, что IIRC, пока я не написал эти два конструктора, код даже не компилировался. Конечно, это может быть так, как я делал что-то. Я попробую оба варианта удаления конструктора копирования и копирования векторов STL. Благодарю. – user2378099

+0

@ Необязательно: вы были правы в конструкторе копирования, когда я прокомментировал эти функции, программа все еще скомпилирована правильно. – user2378099

6

Почему это сложно?

Просто поместите всех ваших учеников в вектор, затем используйте алгоритм STL random_shuffle и, наконец, просто поместите полученный вектор учеников линейно на все доступные таблицы.

Вам не нужны даже специальные классы для студентов или таблиц действительно

+0

Мне по-прежнему нужен способ отслеживать, где учащиеся сидели, поэтому они не повторяют таблицы. Кроме того, поскольку каждая таблица имеет различное количество доступных мест, мне нужен способ отслеживать это, а также сотрудника, назначенного на конкретный стол. – user2378099

 Смежные вопросы

  • Нет связанных вопросов^_^