2014-03-25 94 views
1

我發現,在CPP我不能在java中投對象的矢量像矢量使用基類(對不起,我保證我永遠不會再提到語言,大聲笑)是安全的在指針

.. 。除非我用三分球,但是從我所看到的其他帖子,似乎它需要大量的代碼做這樣簡單的事情

所以......

class ConnectedSentence 
{ 
    vector<Sentence*> sentences; 
    ... 

但有時需要作爲更一般的矢量返回 (其中句子派生節點)

vector<Node*> getSentencesAsNodes() 
    { 
     return sentences; <----compile error of course 
    } 

,所以我雖然使用

vector<Node*> sentences 

中而不是類,這意味着我將不得不每次我想使用它... 時間轉換爲類句子,但我想知道如果使用一個非常基類來存儲數據是安全的? (或者一個void *指針)

或可能與聯合類型

union unifiedObjectPointer 
{ 
    Node* nodes; 
    Sentences* sentences; 
} 

我不是在路上有信心,我想解決這個問題(我沒有真正使用到C++)

任何意見將不勝感激

謝謝

回答

2

存儲指針到基類是安全的。按基類值存儲對象是不安全的(它會導致分片)。

如果你的設計很好,當你使用指針時,你不應該下注;你應該擁有虛擬功能所需的所有行爲。除非你確信你永遠不需要再次貶低爲任何其他類型(換句話說,除非你對地址本身感興趣,除此之外別無其他),否則不要使用void *作爲存儲空間。

代碼:

class ConnectedSentence 
{ 
    vector<Node*> sentences; 
    ... 

    const vector<Node*>& getSentencesAsNodes() const // return by const reference 
                // from a const function 
    { 
     return sentences; // now fine 
    } 

    vector<Node*>& getSentencesAsNodes() // ... or by return by non-const ref. 
             // from a non-const function 
    { 
     return sentences; // now fine 
    } 
}; 

如果通過值返回向量,向量的一個副本將被製作並返回。

編輯:考慮使用std::vector<std::unique_ptr<Node>>std::vector<std::shared_ptr<Node>>而不是std::vector<Node*>。這將使代碼更安全(異常安全)並且更簡單(您不必手動刪除節點)。