从构造函数初始化列表中传递此函数

mar*_*h44 10 c++

将"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)


sth*_*sth 6

如果另一个类只存储指针/引用,就像你的情况一样,它是安全的.但是你必须确保传递this给的构造函数/函数在构造函数A完成之前不会尝试访问引用的对象.该A对象尚未完全构造,调用A和访问属性的方法可能会导致未定义的结果.