成员函数删除当前实例后

时间:2012-12-10 14:35:04

标签: c++

成员函数删除当前实例后,如何停止后面的代码执行。 见代码。

#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)删除实例,不输出。

4 个答案:

答案 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;
};