返回工厂 unique_ptr

Returning unique_ptr in Factory

也许这是一个简单的问题,因为我对 C++ 还是个新手。我想使用某种工厂来封装我的应用程序中的日志记录。这个想法是只有工厂知道哪个具体 class 将处理函数调用。应用程序将始终调用基本日志记录的抽象接口 class.

工厂方法应该如下所示:

std::unique_ptr<AbstractLoggingClass> Factory::getDefaultLogger(const std::string& param){
    return new ConcreteLoggingClass(param);
}

ConcreteLoggingClassAbstractLoggingClass 的子 class。

但我收到以下错误:

Error: could not convert '(operator new(64ul), (<statement>,
((ConcreteLoggingClass*)<anonymous>)))' from 'ConcreteLoggingClass*'
to 'std::unique_ptr<AbstractLoggingClass>'

我的问题是我不知道如何实例化 ConcreteLoggingClass 和 return 一个 unique_ptrAbstractLoggingClass

我已经找到 this post,但我仍然没有看到解决方案。

您想要的 std::unique_ptr 构造函数是 explicit,因此您需要...嗯...明确说明。尝试

return std::unique_ptr<AbstractLoggingClass>(new ConcreteLoggingClass(param));

std::unique_ptr<T>的构造函数是explicit。它不会从指针隐式转换,因为这样做意味着指针被静默删除。

你可以return一个std::unique_ptr<T>显式构造它,例如:

return std::unique_ptr<AbstractLoggingClass>(new ConcreteLoggingClass(param));

您无法将指针转换为 unique_ptr,您必须创建它:

std::unique_ptr<AbstractLoggingClass> Factory::getDefaultLogger(const std::string& param){
    return std::unique_ptr<AbstractLoggingClass>(new ConcreteLoggingClass(param));
}

如果你有 c++14 或更好的:

std::unique_ptr<AbstractLoggingClass> 
Factory::getDefaultLogger(const std::string& param)
{
    return std::make_unique<ConcreteLoggingClass>(param);
}

如果你可以使用 C++14,你应该使用 std::make_unique:

return std::make_unique<ConcreteLoggingClass>( param );

否则显式创建 std::unique_ptr:

return std::unique_ptr<AbstractLoggingClass>{ new ConcreteLoggingClass{param}};