不使用向量的c ++动态类

时间:2014-04-24 19:18:11

标签: c++ variables private members

所以我碰巧完成了我的家庭作业计划,但今天在演讲期间,我的好教授告诉我们,我们不允许在矢量或列表中使用STL来创建我们的数据库。我们还被告知我们需要私有变量。我这个程序完全错了。这是我到目前为止所做的。

中的

class Student {
   private:
    string last;
    string first;
    int student_id;
    int enroll_id;
    int *grades;
}

class Gradebook {
   public:
    Gradebook();
    void newCourse(Gradebook *info);
   private:
    string name;
    int course_id;
    int count_course;
    int enroll;
    Student *students;
   public:
    //Constructor
}

我知道我可以使用构造函数访问Gradebook的私有成员,因此我可以设置Gradebook中的每个成员。

创建newCourse

的功能
Gradebook::Gradebook() {

  students = new Student;
  course_id=0;
  count_course=0;
  enroll = 0;
}

Gradebook::newCourse(Gradebook *info) {

  int i, loop=0;

  cout << "Enter Number of Courses: ";
  cin >> loop;

  info = new Gradebook[loop];

  for(i=0; i<loop; i++) {

    cout << "Enter Course ID: ";
    cin >> info[info->count_course].course_id;

    cout << "Enter Course Name: ";
    cin >> info[info->count_course].name;

    info->count_course++

  }
}

所以课程现在已经确定。由于Student中的变量是私有的。我不能只使用指向变量的指针来访问它们。有人能告诉我怎么做吗?

4 个答案:

答案 0 :(得分:0)

class Student {
   private:
    string last;
    string first;
    int student_id;
    int enroll_id;
    int *grades;
  public:
    string &getLast(){ return Last; }
    ...
    ...
};

当您需要访问Student::getLast()变量等

时,请致电last


void setLast(string sLast){last = sLast;}写作和 string getLast(){return last;}阅读

动态数组的例子:

    struct Student;
int Count = 0;
Student *Students = nullptr;

int AddStudent(Student nStudent)
{
    Student *Buffer = new Student[Count + 1];
    for (int a = 0; a < Count; a++)
        Buffer[a] = Student[a];
    Buffer[Count] = nStudent;
    if(Students)
        delete[] Students;
    Students = Buffer;
    return ++Count -1
}
void RemoveStudent(int Index)
{
    Student *Buffer = new Student[Count - 1];
    for (int a = 0; a < Index; a++)
        Buffer[a] = Students[a];
    for (int a = Index; Index < Count - 1; a++)
        Buffer[a] = Students[a - 1];
    if (Students)
        delete[] Students;
    Students = Buffer;
}

答案 1 :(得分:0)

好的,我不知道怎么问这个问题,但我实际上已经回答了。但我希望大家对我的方法有所了解。

class Student {
  public: 
   void setID(int ID){student_id = ID; };
   int getID(){return student_id);
  private:
   string last;
   string first;
   int student_id;
   int enroll_id;
   int *grades;
};

class Gradebook {
 public:
  Gradebook();
  void newCourse(Gradebook *info);
  void newStudent(Gradebook *info);
private:
  string name;
  int course_id;
  int count_course;
  int count_student;
  int enroll;
  Student *students;
public:
//Constructor
}

void Gradebook::newStudent() {

    int i, loop=0;

int student=0;
string lastName;

cout << "Enter number of students: ";
cin >> loop;

for(i=0; i<loop; i++) {

    cout << "Enter Student ID: ";
    cin >> student;

    info->students[info->count_student].setID(student);

    cout << "Enter Last Name: ";
    cin >> lastName;

    info->students[info->count_student].setLast(lastName);

    info->count_student++;

}
}

这样做有什么不对吗?

答案 2 :(得分:0)

编辑:您不能将“学生*学生”用于多个学生的容器......

您可以使用自己的列表。像

这样的东西
struct Participant{ // or class (and maybe more clever name)
    Student *student;
    Participant *prev;
    Participant *next;
};

你必须做一些小指针 - 杂技,但也许这就是这个练习的想法。 和之前的回答一样,在Student类中使用get和set函数。

答案 3 :(得分:0)

好的,我很抱歉,但你的代码很乱...... 我不能为你做这个功课,但这里有一些提示想到

  1. 您确定为学生,课程和成绩簿制作不同的课程会更容易吗?我不知道你的家庭作业规范,所以我不能确定你的课程应该做什么。

  2. 您不能使用int *成绩来存储所有一个学生成绩。同样适用于学生*学生。你不能像数组学生一样访问iterate *学生[i] .something() 如果你使用像参与者这样的帮助类(或结构),你必须通过循环迭代找到合适的学生。请注意,您已经存储了第一个&#39;课堂上的参与者和学生&#39;保持你的学生数量(也在课堂内)

    Participant *current = first;
    int id = Id; // Id is from function/method call
    
    for(unsigned int i = 0; i < students; ++i){
       if(current->getId()== id){
           // do something and
           break;
       }
       else if(current->next != NULL){ // test this just in case
           current = current->next;
       }
       else break; // something went wrong
    }
    
  3. 将所有学生存储在一个列表(您制作的)中并使用课程或成绩簿中的指针或在任何地方使用指针可能是个好主意...如果您知道静态&#39;这是一个提示

        class Student{
            public:
               .   // get and set functions
              static Student* getStudent(int id); // return NULL if no student with id
            private:
              static Student *first;
              static Student *last;
              static unsigned int counter; // helps with loops, but you can always use next != NULL
              Student *next;
              Student *prev;
        }
    

    将它放在Student构造函数中 与你创建的第一个学生你先设置并最后指向他/她,然后将其设为NULL。之后,始终在您创建新学生时设置

        this->prev = last;
        last->next = this;
        last = this;
        this->next = NULL;
    
    1. 不要在类中实现程序逻辑。在main()或其他函数中执行,但我认为main()现在没问题。如果你需要在成绩册中添加新学生,请在main()中询问所有必要的信息,并制作一些函数,如Gradebook :: newStudent(int&amp; Id,string&amp; last_name){//将学生信息存储在成绩册中}
    2. 通常这些家庭作业编程练习不太花哨或精简或完全优化。所以不要过度;)