2015-06-15 6 views
0

Это хорошая идея иметь такой код: Любые подводные камни? Это лучший дизайн, чтобы использовать общий указатель?Пропустить слабый этот указатель к своей собственной функции

class X { 
    public: 
    void foo(); 
    void bar2(const boost::weak_ptr<X>& x); 
}; 

void X::foo() {} 
void X::bar2(const boost::weak_ptr<X>& x) {} 
void foo() 
{ 
    const boost::shared_ptr<X> x = boost::make_shared<X>(); 
    boost::weak_ptr<X> weakX(x); 
    x->bar2(weakX); 
} 

int 
main() 
{ 
    foo(); 
    return 0; 
} 
+0

Код верный (возможно, проблемы с дизайном, не обнаружены) –

+0

Очевидным недостатком является то, что этот указатель является обычным указателем, поэтому вы можете столкнуться с ситуацией, когда объект уничтожается при выполнении функции-члена, береги себя. Вы можете посмотреть std ::/boost :: enable_shared_from_this. Те же подводные камни. –

ответ

0

Если аргумент, передаваемый в функцию должен всегда быть weak_ptr -версией этого у вас есть проблемы. В коде нет ничего, обеспечивающего такое поведение, поэтому пользователь вашего класса может так же легко передать weak_ptr другому объекту class X.

Если то, что вам нужно для bar2, чтобы иметь возможность пройти на shared_ptr к this, лучшим решением является использование std::enable_shared_from_this

Пример

#include <iostream> 
#include <memory> 

struct Foo : public std::enable_shared_from_this<Foo> { 
    Foo() { std::cout << "Foo::Foo\n"; } 
    ~Foo() { std::cout << "Foo::~Foo\n"; } 
    std::shared_ptr<Foo> getFoo() { return shared_from_this(); } 
}; 

int main() { 
    Foo *f = new Foo; 
    std::shared_ptr<Foo> pf1; 

    { 
     std::shared_ptr<Foo> pf2(f); 
     pf1 = pf2->getFoo(); // shares ownership of object with pf2 
    } 

    std::cout << "pf2 is gone\n"; 
} 

Выход:

Foo::Foo 
pf2 is gone 
Foo::~Foo 

от http://en.cppreference.com/w/cpp/memory/enable_shared_from_this/shared_from_this