Создание и использование динамического c массива в C ++ - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь завершить sh школьное задание на C ++, и у меня возник вопрос, который может быть простым. Я создал все файлы (больше, чем ниже, которые, как мне казалось, не нужно было добавлять) с нуля, и я остаюсь, почесывая голову. Мне сказали создать частный динамический массив c объектов, который будет определяться пользовательским вводом. Это будет в файле "student. cpp". Этот динамический массив c предназначен для создания объектов, которые будут работать с файлом "course. cpp". Я предпринял множество обходных путей, но не нашел ответа и ожидаю, что ответ будет очевидным. Вот урезанная версия моего кода. Я также прокомментировал, где проблема находится в файле студента. cpp и другие возможные вопросы.

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

//source.cpp
#include <iostream>
#include "student.h"
using namespace std;
void main() {
    student stu;
    stu.printRecord();
}
//student.h
#ifndef STUDENT_H
#define STUDENT_H
#include<iostream>
#include<string>
#include "course.h"
using namespace std;
class student{
public:
    student();
    void printRecord();
    ~student();
private:
    string name;
    int numCourses;
    course* stuCourses;        //possible source of error
};
#endif
//student.cpp
#include "student.h"
student::student(){
    cout << "enter name: ";
    getline(cin,name);
    cout << "Enter the number of courses the student is taking: ";
    cin >> numCourses;
    course* stuCourses= new course[numCourses];     //possible source of error (now this->stuCourses = new course[numCourses];)
}
void student::printRecord(){
    cout << endl << name << endl;
    course::printCourse();         //Error at this point
}
//course.h
#ifndef COURSE_H
#define COURSE_H
#include <iostream>
using namespace std;

class course{
public:
    course();
    void printCourse();
    ~course();
private:
    string title;
};
#endif
//course.cpp
#include <iostream>
#include "course.h"
course::course(){
    cout << "Title: ";
    cin >> title;
}
void course::printCourse(){
    cout <<title;
}
course::~course(){}

Опять же, любая помощь приветствуется. Спасибо за просмотр, даже если вы не отвечаете.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020
class course{
public:
    course();
    void printCourse();
    ~course();
private:
    string title;
};

Здесь вы определили printCourse как нестатический c -метод курса класса.

Но там, где возникает ошибка: course::printCourse() вы пытаетесь выполнить статистику c метод класса Курс. Если вы не знаете, о чем я здесь говорю, это краткое резюме (но я рекомендую прочитать о различиях между методами stati c и non stati c):

A stati c Метод работает без экземпляра класса. Это обычно используется в синглетах, которые по замыслу «всего один объект». Это может быть, например, глобальный ID-счетчик для студентов:

class StudentIdManager
{
  static int num_students = 0;

public:
  static int getNextStudentId() 
  {
    return num_students++;
  }
}

Теперь вы можете получить следующий уникальный идентификатор для студента, вызвав StudentIdManager::getNextStudentId() без фактического объекта. Вы можете назвать это «функцией класса». Не «объектная функция».

Класс stati c явно не подходит для вашего курса, поэтому имеет смысл реализовать его так же, как вы.

Однако у вас есть позвонить на фактический объект. Сложность состоит в том, чтобы найти каждый объект в динамически распределенном массиве, но у вас должна быть вся необходимая информация. В конце это выглядело бы примерно так:

void student::printRecord()
{
  cout << endl << name << endl;
  for (size_t i = 0u; i < numCourses; i++)
  {
    // here you're now calling the method printCourse on an actual course as intended instead of a static class
    stuCourses[i]->printCourse();
  }
}

Однако я также нахожу странным, что вы должны это реализовать. Простой std::array<course, numCorses> для фиксированного числа курсов или std::vector<course> для переменного числа курсов сделает код более читабельным, безопасным и расширяемым.

То, что вы здесь делаете, это хорошая задача для C привыкнуть к архитектуре фон Неймана.

Но не для C ++. Это не тоже самое. К сожалению, для большинства учителей C ++ - это «C с классами», что неправильно на многих уровнях. Все функции, добавленные в C ++, позволяют вам не писать код так, как хочет ваш учитель.

0 голосов
/ 22 апреля 2020

Вместо:

course* stuCourses= new course[numCourses];

Можно использовать:

this->stuCourses = new course[numCourses];

Или даже:

stuCourses = new course[numCourses];
...