程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> enable_share_from_this功能介紹

enable_share_from_this功能介紹

編輯:C++入門知識

這個類很有意思,讓一個被shared_ptr管理生命周期的類能夠在自己的成員函數內部訪問shared_ptr。有點繞。

舉個例子,下面的代碼在函數f內部通過this構造了shared_ptr對象,然後打印x_的值。

[cpp] 
class B { 
public: 
    B(): x_(4) { 
        cout << "B::B()" << endl; 
    } 
     
    ~B() { 
        cout << "B::~B()" << endl; 
    } 
     
    void f() { 
        shared_ptr<B> p(this); 
        cout << p->x_ << endl; 
        //shared_from_this(); 
    } 
     
private: 
    int x_; 
}; 
 
 
/*
 * 
 */ 
int main(int argc, char** argv) { 
    shared_ptr<B> x(new B); 
    x->f(); 
    return 0; 

編譯通過,但是運行結果:
[cpp] 
B::B() 

B::~B() 
B::~B() 
兩次析構B對象,這是個災難。
現在試一下enable_shared_from_this:
[cpp] 
class A : public enable_shared_from_this<A> { 
public: 
    A() { 
        cout << "A::A()" << endl; 
    } 
     
    ~A() { 
        cout << "A::~A()" << endl; 
    } 
     
    void f() { 
        //cout << shared_from_this()->x_ << endl; // this way is okay too 
        shared_ptr<A> p = shared_from_this(); 
        cout << p->x_ << endl; 
    } 
     
private: 
    int x_; 
}; 
 
 
/*
 * 
 */ 
int main(int argc, char** argv) { 
    shared_ptr<A> x(new A); 
    x->f(); 
    return 0; 

運行結果:
[cpp] 
A::A() 

A::~A() 
那麼,為什麼需要這樣做呢?在自己的類裡面訪問自己的成員,其實只是個示例代碼,一定必要都沒有。

不過有一種可能,就是f函數需要返回自己的指針給調用者,難道這樣寫麼?

[cpp]
A* f(); 
一個裸指針返回出去,失控了。誰也不知道調用者會干什麼?
比較聰明的方法是設計成:

shared_ptr<A> f()

好了,這就是為什麼我們需要enable_shared_from_this。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved