成员函数删除当前实例后,如何停止后面的代码执行。 见代码。
#include <iostream>
class A;
void callfun(int i,A *pt);
class A {
public:
A() { sss="this is A."; }
virtual ~A() {}
void foo(int i) {
callfun(i,this); //call a function.Don't return value.Maybe delete instance.
out();
}
private:
void out() {
std::cout<< "Out:" <<std::endl;
std::cout<< sss << std::endl;
}
std::string sss;
}
void callfun(int i,A *pt) {
if (i==0)
delete pt; //If conditions are matched,delete instance.
}
int main() {
A *a1=new A;
a1->foo(1); //print:Out:this is A.
a1->foo(0); //delete a1,don't print.But in fact it would print.how to do?
}
我想要的结果:foo(1)输出“Out:这是A。”,foo(0)删除实例,不输出。
答案 0 :(得分:2)
免责声明:这很糟糕。的坏即可。可怕。
void foo(int i) {
if ( i == 1)
{
callfun(i,this); //call a function.Don't return value.Maybe delete instance.
out();
}
else
{
delete this;
}
}
请注意,在完成delete this;
之后(实际需要的情况很少见),调用实例上的任何非static
函数,访问指针(内部或外部)都是非法的方法)或访问任何数据成员。
答案 1 :(得分:0)
这是不可能的,因为评论指出foo
不应该知道删除。这本身就是下一行Undefined Behavior。如果callfun
调用delete this
,那么foo
必须立即返回,而不必查看this
。因此,您甚至无法在this
中设置“已删除”标记。
我最接近的是
void callfun(int i, A *pt) {
if (i==0) {
delete pt;
throw 0;
}
}
void A::foo(int i) {
try {
callfun(i,this); // No _visible_ return value.
out();
} catch (int) { }
}
答案 2 :(得分:0)
如果您在内部删除,封闭范围如何知道它已被删除?您应该只标记它并将其留给用户/封闭范围以实际处理它。
答案 3 :(得分:0)
以下是更完整的代码。
class A;
class B {
public:
void creat() {
pp=new A;
}
void remove() {
delete pp;
pp=NULL;
}
private:
A *pp;
};
class A {
public:
void foo(int i) {
callfun(i,this);
if (flag)
out();
else
bb->remove();
}
private:
B *bb;
};