2013-02-22 154 views
1
class a 
{ 
private: 
    std::shared_ptr <std::string> sptr; 
public: 
    void set(std::string & ref) 
    { 
    sptr = &ref; //error 
    } 
}; 

解決方法是什麼?我需要保留引用作爲參數,我需要私有指針爲shared_ptr。將std :: shared_ptr設置爲指向參考

+0

@Kerrek SB謝謝。你可以用它做出答案。 – user1873947 2013-02-22 12:50:13

回答

7

要將新的原始指針賦值給一個共享指針,並使共享的指針取得所有權,使用成員函數reset

std::shared_ptr<Foo> p; 

p.reset(new Foo); 

共享指針對象的股份所有權,所以它幾乎是不可能的讓你的sptr明智地分享所有權的任意參考。 (例如sptr.reset(&ref)幾乎肯定會COM ­ pletely錯了。)適當的事是使字符串的新副本,即無論是sptr.reset(new std::string(ref)),或更好:

sptr = std::make_shared<std::string>(ref); 
+0

如果它不是'std :: string',而是一個可以更改的自定義類,請考慮['std :: enable_shared_from_this'](http://en.cppreference.com/w/cpp/memory/enable_shared_from_this)。 – 2013-02-22 13:05:49

+2

@ArneMertz:是的,但這是相當微妙和專業。你必須完全設計這個類,因爲它從一開始就被共享指針所擁有。儘管適當的話,這是一個好主意! – 2013-02-22 13:14:26

2

如果你想存儲你參考的地址,如果你想存儲新的對象,那麼你可以使用

sptr = std::shared_ptr<std::string>(&ref, [](const std::string*){}); 

否則 - 使用Kerrek SB變種。

+0

這是有效的,但它強加了一個關鍵的不成文和非局部的假設,即參考文獻超過了'a'對象的所有副本。 – 2013-02-22 12:55:07

+3

'shared_ptr'在沒有刪除器的情況下變得相當無用。這只是一個非擁有的參考(應該使用什麼原始指針)。它唯一提供的是weak_ptrs可以檢查對象是否仍然存在,但是如果它們被鎖定,它們實際上不會延長生命期。沒有人延長壽命。 – David 2013-02-22 12:56:30