2017-08-05 17 views
-2

これを最初に投げ捨てて、私はまだ学校でどのようにプログラムするかを学んでいます。クラスの1つを指すポインタを使って動的に作成された配列を読み込む際に問題が発生しました。関数readClassArray()は、student.getCreditNumberから変数を戻していません。プログラムはVisual Studioで正常に準拠していますが、readClassArrayを取得すると、s.getCreditNumberが0を返すため、関数をスキップするだけです。あなたがsを作成しましたreadCourseArrayの開始時Student.cppクラスC++からの配列を動的に作成

#include "Student.h" 
#include <iostream> 
#include <string> 

using namespace std; 

void readStudent(); 
void readCourseArray(); 
void computeGPA(); 
void printSummary(); 

void readStudent() { 
Student a; 
string number; 
string firstName; 
string lastName; 
int courses; 

cout << "Enter student number: "; 
cin >> number; 
a.setStudentNumber(number); 
cout << "Enter student first name: "; 
cin >> firstName; 
a.setFirstName(firstName); 
cout << "Enter student last name: "; 
cin >> lastName; 
a.setLastName(lastName); 
cout << "Enter student number of courses: "; 
cin >> courses; 
a.setCreditNumber(courses); 

cout << "\n"; } 


void readCourseArray(){ 
Student s; 
s.courses = new Courses[s.getCreditNumber()]; 

int num; 
double cHours; 
string cName; 
char grade; 
cout << "test" << endl; 
for (int i = 0; i < s.getCreditNumber(); i++){ 
    cout << "Enter class " << i + 1 << " number: "; 
    cin >> num; 
    s.courses[i].setCourseNumber(num); 
    cout << "Enter class " << i + 1 << " name: "; 
    cin >> cName; 
    s.courses[i].setCourseName(cName); 
    cout << "Enter class " << i + 1 << " hours: "; 
    cin >> cHours; 
    s.courses[i].setCreditHours(cHours); 
    cout << "Enter class " << i + 1 << " grade: "; 
    cin >> grade; 
    s.courses[i].setGrade(grade); 
    cout << "\n"; 
} 
} 
+0

新しい[]を使用しないでください。std :: vectorを使用してください。 –

+0

readCourseArrayは、関数の最後に破棄されるローカルオブジェクトsを作成します。それは役に立たないようです。 –

+0

トピックオフ:[Member initializer list](http://en.cppreference.com/w/cpp/language/initializer_list)を参照してください。ここではあまり役に立ちませんが、非常に便利で誰もあなたにそれを見せているようには見えません。 – user4581301

答えて

0

#ifndef STUDENT_H 
#define STUDENT_H 
#include <iostream> 
using namespace std; 

class Courses{ 
private: 
    int courseNumber; 
    double hours; 
    string courseName; 
    char grade; 
public: 
void setCourseNumber(int n){courseNumber = n; } 
void setCreditHours(double c) { hours = c; } 
void setCourseName(string n) { courseName = n; } 
void setGrade(char g) { grade = g; } 
int getCourseNumber() { return courseNumber; } 
double getCreditHours() { return hours; } 
string getCourseName() { return courseName; } 
char getGrade() { return grade; } 
}; 
class Student : public Courses{ 
private: 
    string firstName; 
    string lastName; 
    string studentNumber; 
    int creditNumber; 
    double gpa; 
public: 
Courses * courses; 
    Student() { 
    firstName = " "; 
    lastName = " "; 
    studentNumber = " "; 
    creditNumber = 0; 
    gpa = 0.0; 
    courses = NULL; 
} 
~Student() { 
    delete[] courses; 
}; 
void setFirstName(string n) { firstName = n; } 
void setLastName(string l) { lastName = l; } 
void setStudentNumber(string a) { studentNumber = a; } 
void setCreditNumber(int num) { creditNumber = num; } 
string getFirstName() { return firstName; } 
string getLastName() { return lastName; } 
string getStudentNumber() { return studentNumber; } 
int getCreditNumber() { return creditNumber; } 
}; 
#endif 

。それが起こると、creditNumberメンバの値は、デフォルトのコンストラクタによって設定されるように0になります。ゼロ以外の値に設定するには何かする必要があります。 readStudentに設定された値が引き継がれることを期待している場合は、2つの機能を一緒に繋ぐ必要があります。それぞれの関数への参照としてStudentオブジェクトを渡すか、またはreadStudentStudentオブジェクトを返して、readCourseArrayに渡します。

関連する問題