消去のコードのところで、一度schoolの配列の一つを消去して、また新しく同じクラスを作っていますが、抽象クラスを継承したstudent以外のクラス(student2など)も作りたいので、このように書いています。バグの原因を色々と調べましたが、自分では何が間違っているのか見当がつかないので質問させていただきました。よろしくお願いします。
#include "stdafx.h"
#include <iostream>
#include <string.h>
using namespace std;
//抽象クラス
class School {
protected:
char ID[10];
public:
char* getID() {
return ID;
}
virtual void addData() {
cin.getline(ID, 10);
}
virtual void showData() {
cout << ID << endl;
}
};
//継承クラス
class Student : public School {
char name[30];
public:
Student(){}
Student(const Student &s) {
strcpy_s(name, s.name);
strcpy_s(ID, s.ID);
}
void addData() {
cout << "IDを入力してください: ";
cin.getline(ID, 10);
cout << "名前を入力してください: ";
cin.getline(name, 30);
}
void showData() {
cout << ID << ' ' << name << endl;
}
};
int main() {
const unsigned maxStudent = 100;
School *school[maxStudent];
int numStudent = 0;
int choice = 0;
while (choice != 4) {
cout << "1) 学生を登録する" << endl << "2) 学生のデータを消去する" << endl << "3)学生のデータを見る" << endl << "4) 終了" << endl;
cin >> choice;
while (getchar() != '\n');
//学生を登録する
if (choice == 1) {
school[numStudent] = new Student;
school[numStudent]->addData();
numStudent++;
}
//学生のデータを消去する
if(choice == 2) {
char id[30];
int flag = 0;
cout << "IDを入力してください" << endl;
cin >> id;
while (getchar() != '\n');
//消去したい生徒のIDが存在するか調べる
int i;
for (i = 0; i < numStudent; i++) {
if (!strcmp(school[i]->getID(), id)) {
flag = 1;
break;
}
}
//消去したい生徒のIDが見つかった場合
if (flag == 1) {
for (i; i < numStudent - 1; i++) {
delete school[i];
school[i] = new Student;
school[i] = school[i + 1];
}
numStudent--;
delete school[i];
}
//消去したい生徒のIDが見つからなかった場合
if (flag == 0) {
cout << "そのIDは存在しません" << endl;
}
}
//登録した学生のデータを見る
if (choice == 3) {
for (int i = 0; i < numStudent; i++) {
school[i]->showData();
}
}
}
return 0;
}