我有五个文件:类T,类M(抽象类),类MC(容器),类AC(创建添加到MC容器中的特定对象)和我的主文件。 我有这些函数来添加一个对象(对于这种情况,AC)并检索你在AC(标题)中找到的数据成员。
程序编译,似乎我可以创建和添加AC对象。但是,当我尝试使用我的GetTitle函数时,程序崩溃,我收到以下错误
“TLab 5.exe中0x00b938e6处的未处理异常:0xC0000005:访问 违规阅读地点0xcccccce4。“
从我抬起头来看,这意味着我有一个糟糕/未初始化的指针。我程序中唯一的指针是:
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++;
}
我没有正确初始化指针吗?我的添加功能实际上对我说谎而没有添加任何内容吗?我环顾四周,但我看到的大多数答案都涉及使用矢量,为了这个项目,我认为我不允许使用,因为教授没有过去。
答案 0 :(得分:2)
您要求用户在构造期间输入集合的大小,但您永远不会填充集合中的这些元素。然后,当您致电AddM
时,它会从CurrentMCSize
继续。您应该在构造函数中将CurrentMCSize
初始化为零,而不是要求它。
答案 1 :(得分: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的任何原因?
编辑:啊,我没有看到它,帕迪打败了我。