返回工厂 unique_ptr
Returning unique_ptr in Factory
也许这是一个简单的问题,因为我对 C++ 还是个新手。我想使用某种工厂来封装我的应用程序中的日志记录。这个想法是只有工厂知道哪个具体 class 将处理函数调用。应用程序将始终调用基本日志记录的抽象接口 class.
工厂方法应该如下所示:
std::unique_ptr<AbstractLoggingClass> Factory::getDefaultLogger(const std::string& param){
return new ConcreteLoggingClass(param);
}
ConcreteLoggingClass
是 AbstractLoggingClass
的子 class。
但我收到以下错误:
Error: could not convert '(operator new(64ul), (<statement>,
((ConcreteLoggingClass*)<anonymous>)))' from 'ConcreteLoggingClass*'
to 'std::unique_ptr<AbstractLoggingClass>'
我的问题是我不知道如何实例化 ConcreteLoggingClass
和 return 一个 unique_ptr
到 AbstractLoggingClass
我已经找到 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}};
也许这是一个简单的问题,因为我对 C++ 还是个新手。我想使用某种工厂来封装我的应用程序中的日志记录。这个想法是只有工厂知道哪个具体 class 将处理函数调用。应用程序将始终调用基本日志记录的抽象接口 class.
工厂方法应该如下所示:
std::unique_ptr<AbstractLoggingClass> Factory::getDefaultLogger(const std::string& param){
return new ConcreteLoggingClass(param);
}
ConcreteLoggingClass
是 AbstractLoggingClass
的子 class。
但我收到以下错误:
Error: could not convert '(operator new(64ul), (<statement>,
((ConcreteLoggingClass*)<anonymous>)))' from 'ConcreteLoggingClass*'
to 'std::unique_ptr<AbstractLoggingClass>'
我的问题是我不知道如何实例化 ConcreteLoggingClass
和 return 一个 unique_ptr
到 AbstractLoggingClass
我已经找到 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}};