在 C++ 的 Switch Case 中创建对象后对对象调用方法
Calling a method on an object after it was created in Switch Case in C++
>我在开关情况下使用 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];因为bee
和p[j]
指向同一个对象,稍后当您这样做时
for(int i = 0; i < than...' i++)
p[i] ->doSomething
你要求死物做某事......
这就是您的代码崩溃的原因。 要解决此问题,您可以delete bee;
发表评论,但我不熟悉您的程序 因此,您试图使用delete bee;
行避免的内存泄漏必须使用类析构函数来完成。
- 对RValue对象调用的LValue ref限定成员函数
- 检查哪个对象调用了另一个对象的对象方法
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 从 Base 引用对象调用派生类的成员
- 为什么为未删除的对象调用析构函数?
- Qt c++不会为所有对象调用move_slot.为什么?
- 使用在堆栈上创建的对象调用虚拟函数
- 使用基类对象调用Dervied Class函数
- C++:允许临时对象调用非常量成员函数的设计理念是什么?
- 从类中的对象调用类中的函数的最佳方法
- 派生对象调用的 Base 方法的模板推导
- 如何使用单个对象调用具有相同名称的两个类函数
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- 如果类没有任何成员变量,则通过临时对象调用类的成员函数的开销是多少?
- 如何对动态数组中的某些对象调用析构函数
- 如何从列表中存储的对象调用成员函数
- 从线程内的对象调用静态方法
- 从成员对象调用方法
- 当包含它的对象调用其析构函数时,unique_ptr是否未分配
- 从对象调用成员对象,错误:引用非常量值的初始值必须是左值