传递baseclass的unique_ptr并将其用作派生类

时间:2015-05-19 12:53:00

标签: c++ polymorphism unique-ptr

我有以下情况:

basestuff是一个实现我的基本模型的共享库... derivedstuff对于每个实现都是不同的,并表示应用程序对象。 utilitystuff是具有实用程序功能的共享库。

以下是代码:

namespace basestuff {
    class Base {}  // Base model
    virtual std::unique_ptr<Base> createNew(); // Factory 
}

namespace derivedstuff {
    class Derived : public Base {}  // Derived model

    // Factory implementation
    std::unique_ptr<basestuff::Base> createNew () {
          return str::unique_ptr<basestuff::Base>(new Derived);
    }
}


namespace utilitystuff {
    class Utility {
        /// get data and populate the vector element
        getDataList(std::vector<std::unique_ptr<basestuff::Base>> &list,
                    std::function<std::unique_ptr<basestuff::Base>()> &factory) 
        {
           for (...)
           {
               // ... Read data from somewhere and populate it...

               // create new element and add to vector
               std::unique_ptr<basestuff::Base> item = factory();

               list.push_back(std::move(item));           
           }
        };
    }
}

以下是我想要的代码:

main()
{
    utilitystuff::Utility reader;
    derivedstuff::Derived dummy;

    std::vector<std::unique_ptr<derivedstuff::Derived> myClassList;
    reader.getDataList(&myClassList, dummy.createNew);
}

但这不起作用,因为unique_ptr需要来自Base类型,即使我将其更改为BasegetDataList()也不接受参数它与Base类不同。

有没有办法只使用Derived上的main()并使Base对此级别透明,而无需在一种类型和另一种类型之间进行转换?

我已经阅读了关于投射的帖子here,但我不想在这里使用演员表。我只想在上面的图层中使用Derived,让底层(Base)解决问题。

0 个答案:

没有答案