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) output "Out:this is A.",foo(0) delete instance,don't output.

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

内部で削除する場合、囲んでいるスコープはそれが削除されたことをどのように認識しますか?実際に廃棄するには、マークを付けて、ユーザー/囲みスコープに任せる必要があります。

于 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 に答える
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 に答える