2

我正在从事一个个人项目,以熟悉 C++11 和 Boost。

我与UrlExtractor基类、TagUrlExtractor派生类和CompoundExtractor派生类有继承关系。ACompoundExtractor可以包含任意数量的UrlExtractors,从而实现复合模式

我很好奇方法签名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));

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

4

1 回答 1

8

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

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

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

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

std::make_shared()与从表达式初始化共享指针时相比,具有异常安全和执行一次动态分配的优势(另请参阅StackOverflow 上的此问答)。new

于 2013-06-04T18:11:06.087 回答