2015-10-20 100 views
2

我有這樣轉換參考共享指針

void Element::setNodes(const BaseClass& input0, const BaseClass& input1) 

這一個功能是通過使派生類調用。

setInputNodes(DerivedClass1, DerivedClass2) 

我遇到的麻煩是我想將節點存儲在向量中。我有這個

std::vector<std::shared_ptr<BaseClass>> m_inputNode; 

和功能

void Element::setNodes(const BaseClass& input0, const BaseClass& input1) 
{ 
m_inputNode.push_back(input0); 
m_inputNode.push_back(input1); 
} 

這不工作,我必須把它存儲爲指針,否則我體驗對象切片。我需要更改API並傳遞指針嗎?我想盡可能少地改變。

+0

是否要創建對象的副本或將參考/指針存儲到原始對象? –

+0

我想要一個指向原始的指針/引用。 – user1876942

回答

2

既然你說,

我希望有一個指針/引用原文。

唯一的選擇是刪除shared_ptr和使用非所屬指針:(刪除所有const■如果你需要一個非const指針)

std::vector<BaseClass const*> m_inputNode; 

void Element::setNodes(BaseClass const& input0, BaseClass const& input1) { 
    m_inputNode.push_back(&input0); 
    m_inputNode.push_back(&input1); 
} 

shared_ptr從根本上表示所有權,這似乎不是你所追求的。

但是,如果我誤解了你,你真的想賦予對象以您的載體(共享)的所有權,你需要通過共享指針傳遞對象到你的功能,以及:

void Element::setNodes(std::shared_ptr<BaseClass> input0, std::shared_ptr<BaseClass> input1) { 
    m_inputNode.push_back(input0); 
    m_inputNode.push_back(input1); 
} 
2

如果您知道別人是管理矢量元素的一生,然後用std::vector<const BaseClass*>作爲類型,並推動要素矢量時使用&input0等。

這裏很難使用std::shared_ptr指針,因爲在使用時您不知道對象是如何創建的。

如果你想保留你的引用,那麼你總是可以把它們放在std::reference_wrapper;設置std::vector<std::reference_wrapper<const BaseClass>>作爲類型。但所有權問題仍然普遍存在;你可能會得到一個懸掛引用的向量。

+0

這是我最初的想法,但我不想擔心所有權問題。 – user1876942

1

你有采取指針到​​元素:

void Element::setNodes(const BaseClass& input0, const BaseClass& input1) 
{ 
    m_inputNode.push_back(&input0); 
    m_inputNode.push_back(&input1); 
} 

因此shared_ptr<>小號必須指向const BaseClass。當你不需要這個時,你必須從參數規格中刪除const

我不建議像這樣的API來滿足您的需求。你不需要明確調用者,你記得指向對象的指針。他可能傳遞分配,甚至臨時對象,是不再有效,當您稍後嘗試使用它們堆棧:

myElement.setNodes(createElement0(), createElement1()); 

希望還是明確關於你的功能的用戶的期望。現在

void Element::setNodes(std::shared_ptr<BaseClass> input0, 
         std::shared_ptr<BaseClass> input1) 
{ 
    m_inputNode.push_back(input0); 
    m_inputNode.push_back(input1); 
} 

用戶必須明確提供指針:

myElement.setNodes(std::make_shared<Element>(createElement0()), 
        std::make_shared<Element>(createElement1())); 

這告訴用戶,你要採取該對象的共享所有權。

+0

@KonradRudolph 1.我沒有看到,除了部分,我在那裏解釋了爲什麼API可能會誤導用戶。你在這裏是對的。我將編輯我的評論來代替使用'std :: make_shared()'。 – cdonat

+0

感謝您糾正此問題。關於(1),你是對的,你的回答明確地描述了警告。我不知道爲什麼我沒有看到。 –