0

主要

#include <stdio.h>
#include "Student.h"
#include <stdlib.h>



void main()
{
Student* pStudents = new Student[0];
int arraySize = 0;

int input = 0;

while(input != 3)
{
    printf("Press 1 to add student, 2 to print and 3 to quit.\n");
    scanf_s("%d", &input);
    switch(input)
    {
    case 1:
        pStudents[numOfStudents].AddStudent(pStudents, arraySize);
        arraySize++;
        numOfStudents++;
        break;
    case 2:
        break;
    case 3:
        break;
    default:
        printf("Invalid input\n");
        break;
    }
}

}

Student.h

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

class Student
{
public:
    Student(void);
    ~Student(void);
     void AddStudent(Student* pStudent, int arraySize);
private:
    string name;
    int ID;
};

学生.cpp

#include "Student.h"

Student::Student(void)
    : name("N/A")
    , ID(0)
{

}

Student::~Student(void)
{
}
void Student::AddStudent(Student* pStudent, int arraySize)
{
if(arraySize == 0)
{
    delete[] pStudent;
    pStudent = NULL;
    pStudent = new Student[1];

}
else
{
    Student* temp = new Student[(arraySize+1)];
    for(int i = 0; i < arraySize; ++i)
    {
        temp[i] = pStudent[i];
    }
    delete[] pStudent;
    pStudent = temp;
}
printf("Enter name of student.\n");
cin >> name;
printf("Enter ID of student. \n");
cin >> ID;
}

さて、私はこれを理解しようとしてきましたが、できません。何が間違っているのかわかりませんが、名前を入力しようとすると書き込み違反が発生し続けます。答えを調べてみましたが、ベクトルを使用しようとしていることをいくつか見ましたが、まだそれらの使用方法を教えられていません。

更新しました

main.cpp

void main()
{
Student* pStudents = new Student[100];
Student studentGenerator;
int numOfStudents = 0;
string name;
int ID;


int input = 0;

while(input != 3)
{
    printf("Press 1 to add student, 2 to print and 3 to quit.\n");
    scanf_s("%d", &input);
    switch(input)
    {
    case 1:
        printf("Enter name of student.\n");
        cin >> name;
        printf("Enter ID of student. \n");
        cin >> ID;
        studentGenerator = Student(name, ID);
        pStudents[numOfStudents] = studentGenerator;
        numOfStudents++;
        break;
    case 2:
        for(int i = 0; i < numOfStudents; ++i)
        {
            studentGenerator.PrintStudents(pStudents[i]);
        }
        break;
    case 3:
        break;
    default:
        printf("Invalid input\n");
        break;
    }
}

}

学生.cpp

#include "Student.h"

Student::Student(void)
: name("N/A")
, ID(0)
{

}

Student::~Student(void)
{
}
Student::Student(string studentName, int studentID)
{   
name = studentName;
ID = studentID;
}
void Student::PrintStudents(Student student)
{
cout << "Name: " <<  name << endl;
cout << "ID: " << ID << endl;
}
4

2 に答える 2

1

あなたのデザインには深刻な欠陥があります。

Student クラスは、実際には "main()" の単なる配列である Student のリストを管理しますか? それは意味がありません!

StudentListのコレクション(配列でもかまいません)を管理するにはどうすればよいStudentですか?

あなたの理解を明確にするために、これは何をしていると思いますか?:

Student* pStudents = new Student[0];

于 2012-08-13T04:49:51.377 に答える
1

配列サイズを 0 に初期化しました。配列サイズは静的であるため、これを行うことはできません。より大きな数値に設定する必要があります。少なくとも 100 のようなものをお勧めします。

Student* pStudents = new Student[100];

また、学生のクラスが改善される可能性があります

学生の名前と ID を受け取り、それらをクラス変数に設定するコンストラクタを作成する必要があります。また、学生クラス内では配列についてまったく心配する必要はありません。配列関数は、テスト クラス レベルまたはメインで処理する必要があります。生徒の名前と ID も、メイン関数またはテスト関数で要求する必要があります.v

また、ユーザーからデータを取得するより良い方法は次のようになります。

cout << "Enter Students name-->";
getline(cin,studentName);

追加の質問へのフォローアップ:

わかりました、これであなたの新しいことを伝えることができます。一般的には、opp を処理する必要があります。これを簡単に言えば、完全に道に迷っているので、本を読んだり、上達したりしてください!

あなたを少し助けるために、あなたはこれをしたいです:メインで、タイプStudentのダミー変数を作成し、それをstudentGeneratorと呼びます。ここから、次の 2 つのオプションがあります。

オプション 1: ユーザーに名前と ID を入力して変数を分離するように依頼します。次に、これらの変数を使用して新しい変数を生成するため、StudentGenerator = new Student(name,id)

オプション 2: 学生クラスに新しいミューテーターを配置し、mutaros を使用してデータを設定します。このオプションはちょっと面倒なので、代わりにオプション 1 を使用します。

この新しい生徒を生成したので、それを配列に入れます。つまり、StudentArray[counter] = StudentGenerator です。

これが完了したので、studentGenerator はガベージであるため、(ループ内で) コマンド StudentGenerator = new Student(name,id) を再利用して、さらに学生を追加できます。

于 2012-08-13T04:59:36.430 に答える