2012-05-10 9 views
7

मैं std :: make_sharedसी ++ 11 पासिंग 'इस' के लिए paramenter के रूप में std :: make_shared

उदाहरण का उपयोग करते हुए 'इस' निर्माता को पारित करने के लिए कोशिश कर रहा हूँ:

// headers 
class A 
{ 
public: 
    std::shared_ptr<B> createB(); 
} 


class B 
{ 
private: 
    std::shared_ptr<A> a; 

public: 
    B(std::shared_ptr<A>); 
} 


// source 
std::shared_ptr<B> A::createB() 
{ 
    auto b = std::make_shared<B>(this); // Compiler error (VS11 Beta) 
    auto b = std::make_shared<B>(std::shared_ptr<A>(this)); // No compiler error, but doenst work 
    return b; 
} 

हालांकि इस ठीक से काम नहीं करता है, कोई सुझाव है कि मैं इसे तर्क के रूप में कैसे ठीक से पास कर सकता हूं?

उत्तर

13

मुझे लगता है कि आप शायद यहाँ चाहते shared_from_this है। comments from David Rodriguez शामिल करने के लिए

// headers 
class A : std::enable_shared_from_this<A> 
{ 
public: 
    std::shared_ptr<B> createB(); 
} 


class B 
{ 
private: 
    std::shared_ptr<A> a; 

public: 
    B(std::shared_ptr<A>); 
} 


// source 
std::shared_ptr<B> A::createB() 
{ 
    return std::make_shared<B>(shared_from_this()); 
} 

अद्यतन:

ध्यान दें कि shared_from_this() चाहिए कभी नहीं एक वस्तु है कि पहले से ही एक shared_ptr द्वारा प्रबंधित नहीं पर कहा जा। यह मान्य है:

shared_ptr<A> a(new A); 
a->createB(); 

अपरिभाषित व्यवहार के लिए निम्न होता है (a पर delete फोन करने का प्रयास) जबकि:

A a; 
a.createB(); 
+0

एंड्रयू बहुत धन्यवाद! – RdR

+7

यह नोट करना shared_from_this() 'आवश्यकता है कि' है कि मौजूदा वस्तु पहले से ही एक 'shared_ptr' में किया जाता है महत्वपूर्ण है। अर्थात। 'int मुख्य() {ए ए; a.createB(); } 'अपरिभाषित व्यवहार है, जबकि' int main() {shared_ptr a (नया ए); a-> createB(); } 'सही है। –

+0

@ डेविडरोड्रिगुएज़-ड्राईबीस बिल्कुल। मैंने तदनुसार जवाब अपडेट किया है। धन्यवाद। –

संबंधित मुद्दे