Чтение в динамически созданный указатель на массив структур - PullRequest
0 голосов
/ 23 февраля 2012

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

Моя проблема в функции readCourseArray при попытке чтения в членах структуры. Если бы кто-нибудь мог сказать мне, как я это делаю, я был бы благодарен. Я знаю, что использование оператора new не является идеальным, поскольку многие указатели не нужны, но это просто то, как мой инструктор требует, чтобы назначение было передано.

#include <iostream>
#include <string>
using namespace std;

struct Student
    {
        string firstName, lastName, aNumber;
        double GPA;
    };
struct Course
    {
        int courseNumber, creditHours;
        string courseName;
        char grade;
    };

Student* readStudent();
Course* readCourseArray(int);
int main()
{
    int courses = 0;
    Student *studentPTR = readStudent();
    Course *coursePTR = readCourseArray(courses);


    delete studentPTR;
    delete coursePTR;
    system ("pause");
    return 0;
}

Student* readStudent()
{       Student* student = new Student;
    cout<<"\nEnter students first name\n";
    cin>>student->firstName;
    cout<<"\nEnter students last name\n";
    cin>>student->lastName;
    cout<<"\nEnter students A-Number\n";
    cin>>student->aNumber;


    return student;
}

Course* readCourseArray(int courses)
{
    cout<<"\nHow many courses is the student taking?\n";
    cin>>courses;
    const int *sizePTR = &courses;
    Course *coursePTR = new Course[*sizePTR]; 

    for(int count = 0; count < *sizePTR; count++)  //Enter course information
    {
        cout<<"\nEnter student "<<count<<"'s course name\n";
        cin>>coursePTR[count]->courseName>>endl;
        cout<<"\nEnter student "<<count<<"'s course number\n";
        cin>>coursePTR[count]->courseNumber;
        cout<<"\nEnter student "<<count<<"'s credit hours\n";
        cin>>coursePTR[count]->creditHours;
        cout<<"\nEnter student "<<count<<"'s grade\n";
        cin>>coursePTR[count]->grade>>endl;
    }


    return coursePTR;
}

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Оператор индекса массива возвращает элемент массива.

coursePTR[count] эквивалентно приращению указателя на начало массива и разыменованию результата, например: *(coursePTR + count).То, что вы получаете, это объект (или ссылка на него) типа Course.Поэтому вам нужно использовать оператор «точка», а не оператор «стрелка» для доступа к элементам:

cin >> coursePTR[count].creditHours;

У вас есть еще одна ошибка:

cin >> coursePTR[count].courseName >> endl;
                                      ^^^^

Это выиграно 'т компилировать.endl может использоваться только для выходных потоков.

0 голосов
/ 23 февраля 2012
Course* readCourseArray(int &courses);    // Update the definition to pass "courses" by reference.

Course* readCourseArray(int &courses)    // Pass the courses by reference so that your main() has the value updated.
{
    cout<<"\nHow many courses is the student taking?\n";
    cin>>courses;
    /*
        You don't need this line.
    */
    // const int *sizePTR = &courses;

    /*
        You've allocated space for "courses" no. of "Course" objects.
        Since this is essentially an array of "Course" object, you 
        just have to use the "." notation to access them.
    */
    Course *coursePTR = new Course[courses]; 

    /*
        "endl" cannot be used for input stream.
    */
    for(int count = 0; count < courses; count++)  //Enter course information
    {
        cout<<"\nEnter student "<<count<<"'s course name\n";
        cin>>coursePTR[count].courseName;
        cout<<"\nEnter student "<<count<<"'s course number\n";
        cin>>coursePTR[count].courseNumber;
        cout<<"\nEnter student "<<count<<"'s credit hours\n";
        cin>>coursePTR[count].creditHours;
        cout<<"\nEnter student "<<count<<"'s grade\n";
        cin>>coursePTR[count].grade;
    }

    return coursePTR;
}
...