我正在做一个个人项目,以使自己熟悉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
的优点是异常安全且动态分配少。