2015-12-21 110 views
4

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

工厂方法应该是这样的:

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

ConcreteLoggingClassAbstractLoggingClass一个子类。

,但我得到了以下错误:

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

我的问题是,我不知道如何实例ConcreteLoggingClass并返回到unique_ptrAbstractLoggingClass

我已经找到this post,但我还是不要没有看到解决方案。

+0

为什么?请你解释一下,而不是默默无闻地冷静下来。 –

+0

我仍然没有得到downvote。但是要感谢其他人提供有用的答案。 –

回答

9

你想要的std::unique_ptr的构造函数是explicit,因此你需要......很好......清楚地说明它。尝试

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

这样做的工作。非常感谢你! –

1

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

您可以返回std::unique_ptr<T>明确构建它,例如:

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

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

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

,如果你有C^++ 14或更高版本:

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

我目前没有C++ 14可用。但是谢谢你提出这个建议,也许我可以在将来使用它。 –

6

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

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

另有明确创建std::unique_ptr

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

我还没有C++ 14。但是我已经知道make_unique了。这看起来非常方便。 –