我正在做一个个人项目,以使自己熟悉C++ 11和Boost。

我与UrlExtractor基类,TagUrlExtractor派生类和CompoundExtractor派生类具有继承关系。 CompoundExtractor可以包含任意数量的UrlExtractors,从而实现composite pattern

我很好奇CompositeExtractor.addExtractor的方法签名应该是什么样子。由于我正在处理多态类型,因此我不得不使用指针(或引用)。我想使用新的智能指针,特别是shared_ptr

我试着这样编写addExtractor成员函数:

void addExtractor(shared_ptr<UrlExtractor> extractor);

但是,如果尝试编写,则会出现编译错误:
compound.addExtractor(new TagUrlExtractor());

问题是创建一个shared_ptr<UrlExtractor>需要两次隐式转换:一个到UrlExtractor基类,第二个到shared_ptr

我可以这样调用函数:
compound.addExtractor(shared_ptr<UrlExtractor>(new TagUrlExtractor));

但是,这非常冗长。这种情况如何正常处理?

最佳答案



这不是问题:问题在于,接受原始指针的shared_ptr的构造函数被标记为explicit,因此它不能在复制初始化上下文中使用(功能参数是复制初始化的,如8.5 / 15)。

您可以(实际上应该)使用 std::make_shared :

compound.addExtractor(std::make_shared<TagUrlExtractor>());

与从std::make_shared()表达式初始化共享指针(另请参阅this Q&A on StackOverflow)时相比,new的优点是异常安全且动态分配少。

10-02 23:29