在工厂中返回唯一的\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++做出这个决定。A
ConcreteLoggingClass
是一个
AbstractLoggingClass
,在Liskov替换原则的意义上使用“是A”。为什么?请你解释一下,不要只是默默地投反对票。我还是没有得到反对票。但是感谢大家提供了有用的答案,我现在还没有c++14。但是谢谢你提出这个建议,也许我将来可以用它。我还没有C++14。但我已经知道让你独一无二。这看起来很方便。
return std::make_unique<ConcreteLoggingClass>( param );
return std::unique_ptr<AbstractLoggingClass>{ new ConcreteLoggingClass{param}};