类中动态的类数组

时间:2011-10-17 03:44:56

标签: c++ arrays class dynamic

我正在尝试使用其中的另一个类'对象的动态数组来构建一个类。基础外部类是Sport,辅助(数组内部)是Player。我有一些问题让添加功能工作,现在我终于让它工作(我想)我从显示器得到错误。当我调用Display函数时,它是Player类的一部分,我收到一个读错误。我会在这里发布最大的一段代码,如果有人注意到我错了,请尽快告诉我。我需要尽快完成这项工作,这项任务很早就要完成了,未来的任务有助于建立在它之上。我不仅需要一个工作版本,我需要了解出了什么问题。

#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;
}

1 个答案:

答案 0 :(得分:3)

使用

temp[length] = &PromptUser();

你正在拿一个临时的地址。该对象将立即被销毁,您将被指向一个无效的对象。你需要以某种方式制作一个永久物体。例如:

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

不要忘记删除它。

更好 - 不要使用这样的原始数组。使用像std :: vector这样的容器。