2

我有五个文件:T 类、M 类(抽象类)、MC 类(容器)、AC 类(创建添加到 MC 容器中的特定对象)和我的主文件。我有这些函数来添加一个对象(在本例中为 AC)并检索您在 AC 中找到的数据成员(标题)。

程序编译,看来我可以创建和添加一个 AC 对象。但是,当我尝试使用 GetTitle 函数时,程序崩溃并出现以下错误

“TLab 5.exe 中 0x00b938e6 处未处理的异常:0xC0000005:访问冲突读取位置 0xcccccce4。”</p>

从我查找的内容来看,这意味着我有一个错误/未初始化的指针。我的程序中唯一的指针是这样的:

 M *C[MCSize] //Found in MC.h

MC 的构造函数如下所示:

 MC::MC()
 {
cout << "Enter Name: ";
getline(cin, CName);

cout << "Enter size of collection: ";
cin >> CurrentMCSize;
if (CurrentMCSize < 0 || CurrentMCSize > MCSize)
{
    cout << "Size is invalid. Please re-enter: ";
    cin >> CurrentMCSize;

 }; //MCSize is defined in the header of MC.

调用输入的标题的函数在这里:

 void MC::ListMTitles()
 {
      for (int i = 0; i < CurrentMCSize; i++)
      {
         cout << i << ". " << Collection[i]->GetTitle();
      }
 };
 //GetTitle is defined in M.cpp

DMA发生的地方://MC.cpp

 void MC::AddM()
 {
int Selection;
if(CurrentMCSize < MCSize)
{
    DisplayMTypeMenu();
    Selection = GetMTypeSelection();
    switch(Selection)
    {
    case 1: Collection[CurrentMCSize] = new AC;
    break;
    // Other case statements

    }
    if (0 == Collection[CurrentMCSize])
    {
        cout << "Error: Memory Allocation Failed.";
        exit(1);
    }
    else
    {
        cout << "New M Type added!" << endl << endl;
    }
    CurrentMCSize++;
}

我没有正确初始化我的指针吗?我的 Add 函数实际上是在欺骗我,并且没有添加任何内容吗?我环顾四周,但我看到的大多数答案都涉及使用向量,为了这个项目,我认为我不允许使用向量,因为教授没有仔细研究它们。

4

2 回答 2

2

您要求用户在构建期间输入集合的大小,但您从未填充集合的这些元素。然后,当您调用 时AddM,它会从 继续CurrentMCSize。相反,您应该CurrentMCSize在构造函数中初始化为零,并且根本不要求它。

于 2012-12-19T18:49:12.667 回答
1

出现问题是因为这个

  for (int i = 0; i < CurrentMCSize; i++)
  {
     cout << i << ". " << Collection[i]->GetTitle();
  }

从 0 开始,但不能保证 AddM() 将从 0 开始添加:

void MC::AddM()
{
int Selection;
if(CurrentMCSize < MCSize)
{
    DisplayMTypeMenu();
    Selection = GetMTypeSelection();
    switch(Selection)
    {
    case 1: Collection[CurrentMCSize] = new AC;

相反,它将添加任何 CurrentMCSize 可以作为类似 4 输入构造函数的值。您要跟踪三个单独的值:最大支持大小、当前使用的大小和下一个分配项目的插槽,但您已经将最后两个折叠成一个变量。

相关问题 - 您不想简单地使用 std::vector 和 push_back 的任何原因?

编辑:啊,我没看到,帕迪打败了我。

于 2012-12-19T18:59:11.803 回答