在指针向量中使用基类是否安全?

时间:2014-03-25 13:04:23

标签: c++ pointers vector

我发现在cpp中我无法投射像java这样的对象向量(对不起,我保证我再也不会再提这种语言了,哈哈)

...除非我使用指针,但是从我在其他帖子上看到的内容来看,它似乎需要很多代码来做这么简单的事情

所以...

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

但有时需要将其作为更一般的向量返回 (句子派生节点)

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

所以我使用

vector<Node*> sentences
而不是在类中,这意味着每次我想使用它时我都必须转换为类Sentence ... 但我想知道使用一个非常基类来存储数据是否安全? (或无效*指针)

或者可能使用联合类型

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

我对我想解决这个问题的方式没有信心(我不习惯c ++)

任何建议都将不胜感激

感谢

1 个答案:

答案 0 :(得分: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*>。这将使代码更安全(异常安全)并且更简单(您不必手动删除节点)。