переменные — динамические классы c ++ без использования вектора

Так что мне довелось закончить мою домашнюю программу, но сегодня во время лекции мой добрый старый профессор сказал нам, что нам не разрешается использовать 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 являются частными. Я не могу просто использовать указатель на переменные для доступа к ним. Может кто-нибудь показать мне, как это сделать?

1

Решение

Хорошо, я не знал, как задать этот вопрос, но на самом деле я ответил на него. Но я хочу мнение каждого о моем методе.

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++;

}
}

Есть ли что-то плохое в этом?

0

Другие решения

Изменить: Вы не можете использовать «Студент * студенты» для вашего контейнера для нескольких студентов …

Вы можете использовать свои собственные списки. Что-то вроде

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

Вам нужно немного заняться акробатикой с указателями, но, возможно, в этом и заключается идея этого упражнения.
И, как и в предыдущем ответе, используйте функции get и set в классе ученика.

0

Хорошо, я извиняюсь, но ваш код беспорядок …
Я не могу сделать это домашнее задание для вас, но вот несколько советов, которые пришли в голову

  1. Вы уверены, что не было бы проще создавать разные классы для ученика, курса и зачётной книжки? Я не знаю ваших домашних заданий, поэтому не могу быть уверен, что именно ваша программа должна делать.

  2. Вы не можете использовать оценки int * для хранения всех оценок одного ученика. То же самое касается студентов * студентов. Вы не можете получить доступ к итерации * студентов, как массив студентов [i] .something ()
    Если вы используете какой-либо класс справки (или структуру), например, «Участник», вы должны найти нужного ученика, повторяя цикл. Обратите внимание, что у вас есть «первый» участник магазина в вашем классе, а «int ученики» — в вашем числе (также в вашем классе)

    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
    }
    

Возможно, было бы неплохо хранить всех студентов в одном списке (который вы составляете) и использовать указатели в курсе, в зачетной книжке или где-либо еще … Если вы знаете «статический», то здесь подсказка

    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 &Id, строка &last_name) {// сохранить информацию об ученике в дневнике}

Обычно эти упражнения по программированию домашних заданий не должны быть слишком причудливыми, оптимизированными или полностью оптимизированными. Так что не переусердствуйте их;)

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;
}
0
По вопросам рекламы [email protected]