我发现在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 ++)
任何建议都将不胜感激
感谢
答案 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*>
。这将使代码更安全(异常安全)并且更简单(您不必手动删除节点)。