在工厂中返回唯一的\u ptr 也许这是个简单的问题,因为我对C++仍然是新的。我想使用某种工厂来封装我的应用程序中的日志记录。其思想是只有工厂知道哪个具体类将处理函数调用。应用程序将始终调用基本日志类的抽象接口
工厂方法应如下所示:在工厂中返回唯一的\u ptr 也许这是个简单的问题,因为我对C++仍然是新的。我想使用某种工厂来封装我的应用程序中的日志记录。其思想是只有工厂知道哪个具体类将处理函数调用。应用程序将始终调用基本日志类的抽象接口,c++,factory-pattern,unique-ptr,C++,Factory Pattern,Unique Ptr,工厂方法应如下所示: std::unique_ptr<AbstractLoggingClass> Factory::getDefaultLogger(const std::string& param){ return new ConcreteLoggingClass(param); } 我的问题是我不知道如何实例化ConcreteLoggingClass并将唯一的\u ptr返回到AbstractLoggingClass 我已经找到了,但我仍然没有找到解决方案 您想
std::unique_ptr<AbstractLoggingClass> Factory::getDefaultLogger(const std::string& param){
return new ConcreteLoggingClass(param);
}
我的问题是我不知道如何实例化ConcreteLoggingClass
并将唯一的\u ptr
返回到AbstractLoggingClass
我已经找到了,但我仍然没有找到解决方案 您想要的
std::unique\u ptr
构造函数是,因此您需要。。。好。。。明确地说。试一试
return std::unique_ptr<AbstractLoggingClass>(new ConcreteLoggingClass(param));
返回std::unique_ptr(新的ConcreteLoggingClass(param));
std::unique的构造函数是显式的。它不会隐式地从指针转换,因为这样做意味着指针被默默地删除
您可以返回一个显式构造它的std::unique\u ptr
,例如:
return std::unique_ptr<AbstractLoggingClass>(new ConcreteLoggingClass(param));
返回std::unique_ptr(新的ConcreteLoggingClass(param));
您不能将指针转换为唯一\u ptr
,您必须创建它:
std::unique_ptr<AbstractLoggingClass> Factory::getDefaultLogger(const std::string& param){
return std::unique_ptr<AbstractLoggingClass>(new ConcreteLoggingClass(param));
}
std::unique\ptr工厂::getDefaultLogger(const std::string和param){
返回std::unique_ptr(新的ConcreteLoggingClass(param));
}
如果您有c++14或更高版本:
std::unique_ptr<AbstractLoggingClass>
Factory::getDefaultLogger(const std::string& param)
{
return std::make_unique<ConcreteLoggingClass>(param);
}
std::unique\u ptr
工厂::getDefaultLogger(常量std::字符串和参数)
{
返回标准::使_唯一(参数);
}
如果你能使用C++14,你应该使用std::make_unique
:
return std::make_unique<ConcreteLoggingClass>( param );
成功了。非常感谢你!到C++为止的正确答案,但我不知道为什么C++做出这个决定。AConcreteLoggingClass
是一个AbstractLoggingClass
,在Liskov替换原则的意义上使用“是A”。为什么?请你解释一下,不要只是默默地投反对票。我还是没有得到反对票。但是感谢大家提供了有用的答案,我现在还没有c++14。但是谢谢你提出这个建议,也许我将来可以用它。我还没有C++14。但我已经知道让你独一无二。这看起来很方便。
return std::make_unique<ConcreteLoggingClass>( param );
return std::unique_ptr<AbstractLoggingClass>{ new ConcreteLoggingClass{param}};