簡體   English   中英

在Factory中返回unique_ptr

[英]Returning unique_ptr in Factory

也許這是一個簡單的問題,因為我還是C ++的新手。 我想使用某種工廠來封裝我的應用程序中的日志記錄。 這個想法是只有工廠知道哪個具體類將處理函數調用。 應用程序將始終調用基本日志記錄類的抽象接口。

工廠方法應如下所示:

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_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM