2015-12-21 133 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了。這看起來非常方便。 –