[英]Returning unique_ptr in Factory
也許這是一個簡單的問題,因為我還是C ++的新手。 我想使用某種工廠來封裝我的應用程序中的日志記錄。 這個想法是只有工廠知道哪個具體類將處理函數調用。 應用程序將始終調用基本日志記錄類的抽象接口。
工廠方法應如下所示:
std::unique_ptr<AbstractLoggingClass> Factory::getDefaultLogger(const std::string& param){
return new ConcreteLoggingClass(param);
}
ConcreteLoggingClass
是AbstractLoggingClass
的子類。
但是我收到以下錯誤:
Error: could not convert '(operator new(64ul), (<statement>,
((ConcreteLoggingClass*)<anonymous>)))' from 'ConcreteLoggingClass*'
to 'std::unique_ptr<AbstractLoggingClass>'
我的問題是我不知道如何實例化ConcreteLoggingClass
並將unique_ptr
返回給AbstractLoggingClass
我已經找到了這篇文章 ,但我仍然沒有看到解決方案。
你想要的std::unique_ptr
構造函數是explicit
,因此你需要......好吧......明確它。 嘗試
return std::unique_ptr<AbstractLoggingClass>(new ConcreteLoggingClass(param));
如果你可以使用C ++ 14,你應該使用std::make_unique
:
return std::make_unique<ConcreteLoggingClass>( param );
否則顯式創建std::unique_ptr
:
return std::unique_ptr<AbstractLoggingClass>{ new ConcreteLoggingClass{param}};
std::unique_ptr<T>
的構造函數是explicit
。 它不會從指針隱式轉換,因為這樣做意味着指針被靜默刪除。
您可以返回顯式構造它的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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.