0

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

#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:this is A.",foo(0) 删除实例,不输出。

4

4 回答 4

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在您的实例上调用任何非函数、访问指针(在方法内部或外部)或访问任何数据成员都是非法的。

于 2012-12-10T14:38:50.190 回答
0

这是不可能的,因为评论指出foo不应该知道删除。这本身就是下一行未定义的行为。如果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) { } 
}
于 2012-12-10T15:48:35.317 回答
0

如果您在内部删除,封闭范围如何知道它已被删除?您应该只标记它并将其留给用户/封闭范围来实际处理它。

于 2012-12-10T20:58:05.270 回答
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;
};
于 2012-12-11T04:51:03.097 回答