2016-04-28 38 views
-4

私は抽象クラス(Service)を2つの派生クラス(CourtとMachine)で持っています。私もServiceのポインタ配列を持っています。そして、私はCourtとMachineの両方の情報を含むテキストファイルから読み込もうとしています。どの情報がどのクラスに該当するかを確認するには、ifを使用しています。テキストファイルからポインタ配列を読み込む方法は?

私のコードはコンパイルされますが、実行時にセグメント化エラーが発生します。私はこれが私がしてはならないメモリにアクセスしていることを意味していることは承知していますが、私は何が間違っているのか分かりません。

私はポインタ配列を使ったことがありません。オブジェクトを入力しようとしたとき何か間違っていますか?私はプログラムの初めに両方のクラスを必ず含むようにしました。

Service *listServices[20]; 
ifstream ArchService; 
ArchService.open("Services.txt"); 

while(!ArchService.eof()) 
{ 
    for (int iA = 0; iA < 20; iA++) 
    { 

     string clave, descripcion, deporte; 
     int tiempomax, maxpersonas; 
     char tipo; 
     double costo; 
     bool instructor; 
     ArchService >> clave >> tiempomax >> tipo >> costo; 

     if (tipo == 'C' || tipo == 'E' || tipo == 'B') 
     { 
      ArchService >> instructor; 
      ArchService.ignore(); 
      getline(ArchService, descripcion); 
      listServices[iA] = new Machine(clave, tiempomax, tipo, costo, instructor, descripcion); 
     } 

     else 
     { 
      ArchService >> maxpersonas; 
      ArchService.ignore(); 
      getline(ArchService, deporte); 
      listServices[iA] = new Court(clave, tiempomax, tipo, costo, maxpersonas, deporte); 
     } 
     listServices[iA]->print(); 
    } 
    ArchService.close(); 
} 
+0

セグメンテーションフォルトの発生場所を知っていますか? – NathanOliver

+0

ループ条件として 'eof()'を使うのは良い考えではありません。 –

+0

@Lorraine [while(!ArchService.eof()) 'を使用しない](http://stackoverflow.com/q/5605125/418066) – Biffen

答えて

0

listServicesのすべての要素がオーバー割り当てられ、何度も繰り返し、古い値がdelete Dされていないと、そう、彼らはちょうどぶら下がり参照が残っていると、複数のメモリリークを形成します。おそらく、これが根本的な原因です。前にも言及したように、あなたが望むものが20リストサービスの配列を埋めるのであれば、そのループwhile(!ArchService.eof())を削除したいでしょう。

関連する問題