在 C++ 的 Switch Case 中创建对象后对对象调用方法

Calling a method on an object after it was created in Switch Case in C++

本文关键字:对象 调用 方法 创建对象 C++ Switch Case      更新时间:2023-10-16

>我在开关情况下使用 new 创建了一个对象。 该对象被分配给指针数组的元素。 虽然在这种情况下,我可以在该对象上调用方法,但在案例之外,我似乎不能。它只是不这样做。 我有一个函数来设置我可以在案例中调用的对象元素,但在开关案例之外,我似乎无法使用显示对象内容的方法调用该元素。 我认为这里可能存在范围问题,但数组是在开关大小写之外声明的。

下面是一个代码片段:

int main(void)
{
employee * pc[MAX];
showmenu();
int choice;
cin >> choice;
int j = 0;
while(true)
{
switch(choice)
{
case 1 :
{
cout << "j = " << j << endl;
employee * bee = new employee();
pc[j] = bee;
pc[j]->SetAll();
delete bee;
break;
}
case 2 :
{
cout << "j = " << j << endl;
manager * see = new manager();
pc[j] = see;
pc[j]->SetAll();
delete see;
break;
}
case 3 :
{
cout << "j = " << j << endl;
fink * dee = new fink();
pc[j] = dee;
pc[j]->SetAll();
delete dee;
break;
}
case 4 :
{
cout << "j = " << j << endl;
highfink * eee = new highfink();
pc[j] = eee;
pc[j]->SetAll();
delete eee;
break;
}

default :   cout << "That's not a choice.n";
}
showmenu();
cin >> choice;
j++;
if (j>=MAX || choice == 5)
break;

}
for (int i = 0; i < j; i++)
{
cout << "I made it into the for loop " << i << " times" << endl;
pc[i]->ShowAll();
}

return 0;
}

这很简单:在您的case子句中,您立即使用delete销毁对象。

这就是为什么您以后不能调用它的任何方法的原因。

请注意,您放入数组的内容只是指向对象的指针。 存储在变量bee完全相同的指针。

一旦你调用delete它,它就会变得无效。 您不是在创建对象的副本!

以下是代码实际操作的说明:

首先,声明指向对象的指针,然后获取该指针的副本(地址(,然后删除该指针。

所以你有一个内存地址,但你不允许访问它,因为你删除了指针(悬空指针(。

这是一个常见的错误,尤其是当您使用函数然后返回指针时。

我的建议如下:

cout << "j = " << j << endl;
pc[j] = new employee();
pc[j]->SetAll();
break;

delete XXX;语句删除分配给pc元素的对象。

employee * bee = new employee();

好的,员工类对象的动态内存分配。现在在堆内存上 段我们存储了一个员工类对象。该对象的地址已 存储到名为 Bee 的指针。(阅读/谷歌的"新"操作员动态 内存分配,堆内存段对此的理解。这并不难。)

pc[j] = bee;

指针平等!现在 pc[j] 和 bee 指向之前创建的同一对象。使用此语句,两个指针指向堆内存段上的同一对象,因此您可以使用每个指针销毁该对象! 非常危险的情况。这种平等正在召唤你的程序粉碎!

pc[j]->SetAll();

没什么特别的。方法调用... 但问题来了。

delete bee;

此语句正在销毁以前创建的员工类对象。 你问自己怎么做?正因为如此删除蜜蜂; <=> 删除 p[j];因为beep[j]指向同一个对象,稍后当您这样做时

for(int i = 0; i < than...' i++)

p[i] ->doSomething你要求死物做某事......

这就是您的代码崩溃的原因。 要解决此问题,您可以delete bee;发表评论,但我不熟悉您的程序 因此,您试图使用delete bee;行避免的内存泄漏必须使用类析构函数来完成。