将"this"传递给以下代码中初始化列表中的另一个对象时是否有任何问题?
class Callback { public: virtual void DoCallback() = 0; };
class B
{
Callback& cb;
public:
B(Callback& callback) : cb(callback) {}
void StartThread();
static void Thread()
{
while (!Shutdown())
{
WaitForSomething();
cb.DoCallback();
}
}
};
class A : public Callback
{
B b;
public:
A() : b(*this) {b.StartThread();}
void DoCallback() {}
};
Run Code Online (Sandbox Code Playgroud)
如果这样做是不安全的,那么最好的替代方案是什么?
Jar*_*Par 10
如果你非常小心,这将工作正常.如果您开始调用虚方法或使用依赖于该类型中其他对象的方法,您将遇到很多麻烦.但是,如果你只是设置一个参考,这应该工作正常.
更安全(但不是完全安全)的替代方法是在构造函数完成后稍后再设置b.这不会消除vtable问题,但会消除在构造之前访问其他成员变量等问题.
class A : public Callback {
std::auto_ptr<B> spB;
public:
A() {
spB.reset(new B(this));
spB->StartThread();
}
};
Run Code Online (Sandbox Code Playgroud)
如果另一个类只存储指针/引用,就像你的情况一样,它是安全的.但是你必须确保传递this给的构造函数/函数在构造函数A完成之前不会尝试访问引用的对象.该A对象尚未完全构造,调用A和访问属性的方法可能会导致未定义的结果.