2011-10-17 28 views
0

我想在其中創建一個具有另一個類的對象的動態數組的類。基礎外部類是Sport,次要(在數組內)是Player。我有一些問題讓add函數工作,現在我終於可以工作了(我想)我從顯示中獲取錯誤。當我調用播放器類的一部分的顯示功能時,出現讀取錯誤。我會在這裏發佈最大的一段代碼,如果有人注意到wtf我錯了,請儘快告訴我。我需要儘快完成這項工作,分配工作已經過去很久了,未來的任務有助於建立它。我不只需要一個工作版本,我需要了解發生了什麼問題。一類中的類的動態數組

#include "Sport.h" 
#include <iostream> 

using std::cout; 
using std::endl; 
using std::cin; 

// since we're going to call these from within the class 
// consider making all but DisplayMenu() private 

Sport::Sport() : array(0),length(0) 
{ 

} 

Sport::~Sport() 
{ 

} 

void Sport::DisplayMenu() 
{ 
    bool exit(false); 
    char entry(0); 

    while(exit != true) // clarity 
    { 
    cout << "\nOREGON INSTITUTE OF TECHNOLOGY\n" << endl; 
    cout << " A - Add Player" << endl; 
    cout << " S - Search/Display a Player" << endl; 
    cout << " D - Display all Players" << endl; 
    cout << " C - Display Current Count of Players" << endl; 
    cout << " E - Exit/n" << endl; 
    cin >> entry; 

    switch (entry) 
    { 
     case 'A' : 
      Add(); 
      break; 

     case 'S' : 
      Search(); 
      break; 

     case 'D' : 
      List(); 
      break; 

     case 'C' : 
      cout << "Currently " << length << " Players."; 
      break; 

     case 'E' : 
      exit = true; 
      break; 

     default : 

      break; 
    } 

} 
} 

void Sport::Add() //have array[] and length 
{ 
Player **temp = new Player *[length+1]; 

for (int i = 0; i < length; i++) 
{ 
    temp[i] = array[i]; 
} 
temp[length] = &PromptUser(); 
length++; 

delete [] array; 
array = temp; 
} 

void Sport::List() 
{ 
for (int i = 0; i < length; i++) 
    (*array)[i].Display(); // <---this line is crashing the program. 
} 

void Sport::Search() const 
{ 

} 

Player Sport::PromptUser() 
{ 
char name[25]; 
cout << "Enter name: "; 
cin >> name; 

int grade(0); 
cout << "Enter grade: "; 
cin >> grade; 

double gpa(0.0); 
cout << "Enter gpa: "; 
cin >> gpa; 

Player result(name, grade, gpa); 
return result; 
} 
+0

您沒有包含'Sport.h' – Ayjay

回答

3

隨着線

temp[length] = &PromptUser(); 

你正在服用的臨時地址。該對象將立即被銷燬,您將被指向一個無效的對象。您需要以某種方式製作永久物品。例如:

temp[length] = new Player(PromptUser()); 

只是不要忘記刪除它。

更好 - 不要使用這樣的原始數組。使用像std :: vector這樣的容器。