2014-03-07 62 views
2

我遇到了一个需要std::weak_ptr作为构造函数参数的类。问题是弱指针必须指向拥有正在创建的实例的shared_ptr。我无法弄清楚如何传递指针,因为shared_ptr本身只是在类构建完成后才构建或分配的。构造函数期望指向创建的实例的共享指针

struct SomeClass 
{ 
    SomeClass(std::weak_ptr<SomeClass> ptrToThis){...} 
    ... 
}; 

我已经试过了传递weak_ptr给构造以下,但它失败(我相信这是因为原来的shared_ptr不再使用相同的哨兵对象在内部得到后分配到)

int main() 
{ 
    std::shared_ptr<SomeClass> shared; 
    std::weak_ptr<SomeClass> weak; 
    weak = shared; 
    shared = std::make_shared<SomeClass>(weak); 
    //this prints "1" (true) 
    std::cout << weak.expired(); 
    return 0; 
} 

这怎么解决?由于我可以修改原始类,我应该以某种方式修改它,例如添加一个单独的函数来设置构建后的weak_ptr的值?

+0

为什么有人传递了weak_ptr本身?你想做什么?您无法将其集成到ctor中,因为它是在ctor中创建的。 – Samuel

+4

您是否试图重新创建['std :: enable_shared_from_this'](http://en.cppreference.com/w/cpp/memory/enable_shared_from_this)? – Angew

+0

我对C++ 11相当陌生,不知何故我不知道'std :: enable_shared_from_this'。匆匆一瞥,这似乎是一个完美的解决方案。 – jms

回答

3

你可能会更好使用std::enable_shared_from_this,这是专为这种情况而设计的。

要使用它,从它派生你的类。它将存储std::weak_ptr将被初始化为指向对象首次std::shared_ptr指向该对象被创建:

struct SomeClass : public std::enable_shared_from_this<SomeClass> 
{ 
    //... 
}; 

如果你需要确保一个std::shared_ptr到您的类始终存在,可以使它的所有构造函数的私有(或保护,如适用),并给它一个公共静态创建函数返回一个std::shared_ptr

struct SomeClass : public std::enable_shared_from_this<SomeClass> 
{ 
    std::shared_ptr<SomeClass> create() 
    { return std::make_shared<SomeClass>(); } 

private: 
    SomeClass() 
    {} 
};