gpt4 book ai didi

c++ - 在指针 vector 中使用基类是否安全

转载 作者:行者123 更新时间:2023-11-30 04:07:06 26 4
gpt4 key购买 nike

我发现在 cpp 中我无法像在 java 中那样转换对象 vector (抱歉我保证我再也不会提到那种语言了,哈哈)

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

所以...

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

但有时需要将其作为更通用的 vector 返回(其中Sentence派生Node)

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

所以我想用

vector<Node*> sentences

而不是在类里面,这意味着每次我想使用它时我都必须将它转换为 Sentence 类......但我想知道使用非常基类来存储数据是否安全? (或 void* 指针)

或者可能是 union 类型

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

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

如有任何建议,我们将不胜感激

谢谢

最佳答案

存储指向基类的指针是安全的。按基类值存储对象是不安全的(它会导致切片)。

如果你的设计很好,那么在使用指针时就永远不必向下转型;您应该让虚函数公开所有需要的行为。

此外,不要使用 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
}
};

如果按值返回 vector ,将创建并返回 vector 的拷贝。

编辑:考虑使用 std::vector<std::unique_ptr<Node>>std::vector<std::shared_ptr<Node>>而不是 std::vector<Node*> .这将使代码更安全(异常安全)和更简单(您不必手动删除节点)。

关于c++ - 在指针 vector 中使用基类是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22635533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com