【问题标题】:Ho can I report sub-class values where sub-classes are stored in a std::vector<parent-class>我可以报告子类存储在 std::vector<parent-class> 中的子类值吗
【发布时间】:2015-05-06 02:26:22
【问题描述】:

我有一个 std::vector 指向父类动物的智能指针。

std::vector<std::shared_ptr<animal>> farm; 

子类 cat、dog 和 mouse 各有父类动物。 向量中仅指向 cat、dog 和 mouse。像这样

class cat : public animal {
public:
    bool claws;
};

farm.push_back(std::make_shared<cat>());
farm.push_back(std::make_shared<dog>());
farm.push_back(std::make_shared<mouse>());

Cat 也有公共成员 cat.claws(bool 类型)。

我知道farm[0].claws 不起作用,因为claws 不是farm 的虚拟成员。有没有办法在不创建单独的虚拟功能的情况下循环农场时访问爪子?在实际问题中,当程序在农场(无限期地)循环时,我想向用户报告许多不同的子类变量。

【问题讨论】:

  • 关键是这里的意图...为什么你想访问claws
  • 用于报告目的。我在循环中处理的每个子类的虚函数取决于每个子类唯一的变量集。我也想报告这些独特的变量,因为它们在运行时会发生变化。
  • 从虚函数中执行它 - 您知道对象是哪个子类。
  • 这是我目前的策略,但它使代码混乱,我希望 c++ 有一些隐藏的技巧可以提供一种更简洁的方法。
  • 它不会杂乱无章。你不需要技巧。很清楚——当然,除非你完全误解了这个方法。邮政编码。

标签: c++


【解决方案1】:

您可以为此使用dynamic_caststd::dynamic_pointer_cast,例如:

if(auto catPtr = std::dynamic_pointer_cast<cat>(animalPtr))
{
    // now you use catPtr.claws
}

(假设 animalPtr 的类型为 std::shared_ptr&lt;animal&gt;

【讨论】:

  • 今晚我会尝试实现这个,看起来就像我希望的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
  • 2021-11-17
  • 2022-08-17
  • 2019-10-25
  • 2023-02-03
  • 1970-01-01
相关资源
最近更新 更多