編集:この回答は、使用しなかったが何も継承しないスタンドアロンクラスとしてQObject
持っていた元の質問への回答でした。class A
質問は後で編集され、この回答は廃止されましたが、使用しない場合に何が必要になるかを示すためにここに残しますQObject
。
これを行う唯一の方法は、タイマーが作動するまでオブジェクトを存続させることです。例えば:
class A : enable_shared_from_this<A> {
void fun() {
QTimer::singleShot(10, bind(&A::timerSlot, shared_from_this()));
}
public:
void timerSlot();
}
auto a = SharedPointer<A>(new A);
a->fun();
a->reset(); // a goes out of scope, but its referent is kept alive by the `QTimer`.
上記が機能する理由はclass A
、タイマーを設定するときに shared_ptr をキャプチャし、タイマーがそれを保持するためです (それ以外の場合は起動できません)。
最新の C++ 機能または Boost が気に入らない、または使用できない場合:
struct Functor {
Functor(SharedPointer<A> a) : _a(a) {}
void operator() { a->timerSlot(); }
SharedPointer _a;
};
class A {
void fun(shared_ptr<A> self) {
QTimer::singleShot(10, Functor(self));
}
public:
void timerSlot();
}
auto a = SharedPointer<A>(new A);
a->fun(a);