c++ - std::shared_ptr 类工厂 C++

标签 c++ inheritance c++11 shared-ptr factory-pattern

我们有一个基类......

class Node
{
   public:
      std::string Name;
      Node(){};
      ~Node(){};
}

FilterNode 的派生类。 Filter 与节点相同,只是它具有“filterId”属性并且它的构造函数填充 Node.Name='Filter'。

class Filter: public Node
{
   public:
      int filterId;
      Filter() : Node()
      {
         Name="Filter";
      }
}

我有一个返回 std::shared_ptr<Node> 的 ClassFactory当传递一个字符串时

请通过此链接在 CodeProject 上找到该工厂的代码。

http://www.codeproject.com/Articles/567242/AplusC-b-bplusObjectplusFactory .

代码似乎实例化了一个Filter,但是返回了一个Node。即对象切片。

std::shared_ptr<Node> n = std::make_shared(Node);  // As expected, doesn't not have filter ID and node.Name is blank.
std::shared_ptr<Filter> f = std::make_shared(Filter);  // As expected, has filterID and node.Name is 'Filter'.

现在我想处理一个 std::shared_ptr(Node) 数组,它实际上可能包含 std::shared_ptr(Filter),具体取决于从工厂请求的类。

std::shared_ptr<Node> nf = std::make_shared(Filter);     // Error. Does not have filterId, but does have **Node**.Name='Filter'.

我什至尝试了更简单的情况......并遇到了同样的问题。

Node n = Node();
Filter f = Filter();
Node nf =Filter();   // Error, nf does not have a filterID, but it's Name field is set to 'Filter'.

我在这里做错了什么? Node 是我所有派生类的基类。当我有一个接受Node 的函数时,我应该能够向它发送一个Filter 并使 filterId 可用。

在这种情况下,建议使用指针来提供帮助,但是随着事情的发展,shared_ptr 是一个指针。

最佳答案

Node对派生类可能定义的附加数据成员和函数一无所知。所以你需要检索一个 shared_ptr<Filter>能够访问filterId .使用 std::dynamic_pointer_cast 做这个。

std::shared_ptr<Node> n = ...
auto f = std::dynamic_pointer_cast<Filter>(n);

if(f) {
    // The managed object is a Filter
    std::cout << f->filter_id << '\n';
}

Live demo

如果你知道 n始终包含 Filter (或派生自 Filter 的东西),您可以使用 std::static_pointer_cast相反。

关于c++ - std::shared_ptr 类工厂 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25903347/

相关文章:

C++11 std::function 比虚拟调用慢?

c++ - 将应用程序与一个库(包括另一个库)链接起来

c++ - 远程调试 windows 8.1 驱动 Visual studio 2013

java - 线程 "main"java.lang.NullPointerException 中出现异常以及如何修复它?

c++ - 文件在多个程序中持续无法打开

C++ 将当前日期和时间与当前日期和设置时间进行比较

c++ - 按键时发送输出

javascript - 好的伪经典 JavaScript 继承模式?

Python,selenium webdriver - 我需要基类方法来返回其子类的类型。如何实现?

c++ - 为什么右值不能绑定(bind)到非 const 左值引用,除了写入临时值无效这一事实之外?