Что не так с моей логикой? Мой Вектор или объект не push_back новый объект. Остается в размере 0 - PullRequest
1 голос
/ 26 января 2012

Я работал над этим весь день и застрял в своей логике в том, как я подошел к этой проблеме.Всякий раз, когда у меня есть Vector<class> blah.И я пытаюсь blah.push_back(class()), это не так, обновлять или работать.

Я проводил исследования и думаю, что это связано с указателями и ссылками.Я попытался изменить Vector<Student> blah на Vector<Student*> blah и использовать 'new' Student(), когда нажимаю его назад, но он все равно дает тот же результат.Я думаю, что неправильно определяю векторы.

#include "std_lib_facilities.h"
using namespace std;

class Student
{
  public:
    string first_name;
    string last_name;
    string major;
    int student_id;

    Student() {};

    Student(int no, string name1, string name2, string majorin)
    {
      first_name = name1;
      last_name = name2;
      student_id = no;
      major = majorin;
    }

};

class Course
{
  public:
    Vector<Student> Students;
    int max_enrollment;
    int course_id;
    string course_title;

    Course() {};

    Course(int no_in,int max_in,string title_in)
    {
      max_enrollment=max_in;
      course_title=title_in;
      course_id=no_in;
    }

};

unsigned int split(const std::string &txt, vector<std::string> &strs, char ch)
{
  unsigned int pos = txt.find( ch );
  unsigned int initialPos = 0;
  strs.clear();

  // Decompose statement
  while( pos != std::string::npos ) {
    strs.push_back( txt.substr( initialPos, pos - initialPos + 1 ) );
    initialPos = pos + 1;

    pos = txt.find( ch, initialPos );
  }

  // Add the last one
  strs.push_back( txt.substr( initialPos, std::min( pos, txt.size() ) - initialPos + 1 ) );

  return strs.size();
}

class University
{
  public:
    Vector<Student> studentlist;
    Vector<Course> courselist;

    University() {};

  void Parse(string input)
  {
    //Case Statements
    vector<string> temp;
    split( input, temp, ' ' );
    cout<<temp[0];
    if (temp[0]=="S ")
    {
      //Add Student to University
      //Student* myStudent=new );
      cout<<studentlist.size()<<endl;
      //Student(atoi(temp[1].c_str()),temp[2],temp[3],temp[4])
      studentlist.push_back(Student()); 
    }
    else if (temp[0]=="C")
    {
      //Add Course to University
      Course myCourse=Course(atoi(temp[1].c_str()),atoi(temp[2].c_str()),temp[3]);
      courselist.push_back(myCourse);
    }
    else if (temp[0]=="L")
    {
      //Add Student to Course list
      //Not Implemented-Find Course by temp[1] which is a int
      for (int i=0;i<courselist.size();i++)
      {
        if (courselist.at(i).course_id==atoi(temp[1].c_str()))
        {
          courselist.at(i).max_enrollment=atoi(temp[1].c_str());
        }
      }
    }
    else if (temp[0]=="A")
    {
      for (int i=0;i<courselist.size();i++)
      {
        if (courselist.at(i).course_id==atoi(temp[1].c_str()))
        {
          for (int j=0;j<studentlist.size();j++)
          {
            if (studentlist.at(j).student_id==atoi(temp[1].c_str()))
        {
          Student mystudent=studentlist.at(j);
          courselist.at(i).Students.push_back(mystudent);
        }
          }
        }
      }
    }
    else if (temp[0]=="D")
    {
      for (int i=0;i<courselist.size();i++)
      {
        if (courselist.at(i).course_id==atoi(temp[1].c_str()))
        {
          for (int j=0;j<courselist.at(i).Students.size();j++)
          {
            if (courselist.at(i).Students.at(j).student_id==atoi(temp[1].c_str()))
            {
              //Student mystudent=courselist.at(i).Students.at(j);
          courselist.at(i).Students.erase(courselist.at(i).Students.begin()+j);
            }
          }
        }
      }
    }
    else if (temp[0]=="PS")
    {
      cout<<"--Student Report--\n";
    }
    else if (temp[0]=="PC")
    {
      cout<<"--Student Report--\n";
      for (int i=0;i<courselist.size();i++)
      {
        for (int j=0;j<courselist.at(i).Students.size();j++)
        {
          string first_name=courselist.at(i).Students.at(j).first_name;
          string last_name=courselist.at(i).Students.at(j).last_name;
          string major=courselist.at(i).Students.at(j).major;
          //Waiting List var
          cout<<first_name<<" "<<last_name<<" "<<major<<"\n";
        }
      }
    }
  }
};

int main(int argc, char *argv[])
{
  string input;
  while(1==1)
  {
    cout<<"Command:: ";
    getline(cin,input);
    //cout<<input;

    University myUniversity;
    myUniversity.Parse(input); //Input is in the format X Name Name etc etc. Arguments separated by spaces
    cout<<"DEBUG:"<<myUniversity.studentlist.size();
  }
  return 0;
}

1 Ответ

2 голосов
/ 26 января 2012

Простая ошибка!Не могу поверить, что ты потратил так много времени на это!Ха-ха.

Вы определили свой университет в цикле while!

Я не знаком с C ++ (изучаю сам), но я думаю, что это также должно быть сделано с использованием указателей и ссылок и ключевого слова«новый».

Может ли кто-нибудь объяснить разницу между тем, как он это делает, и другими способами, которые я видел, когда люди используют Student mystudent = new Student ();и т. д.

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