Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Returning unique_ptr in Factory

Maybe this is a simple question, because I'm still new to C++. I would like to use some kind of factory to encapsulate the logging in my application. The idea is that only the factory knews which concrete class will handle the function calls. The application will always call abstract interfaces of the base logging class.

The factory method should look like:

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

ConcreteLoggingClass is a subclass of AbstractLoggingClass.

But I get the following error:

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

My problem is that I don't know how to instantiate ConcreteLoggingClass and return a unique_ptr to AbstractLoggingClass

I already found this post, but I still don't see the solution.

like image 661
little_planet Avatar asked Dec 21 '15 13:12

little_planet


1 Answers

If you can use C++14 you should use std::make_unique:

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

otherwise explicitly create std::unique_ptr:

return std::unique_ptr<AbstractLoggingClass>{ new ConcreteLoggingClass{param}};
like image 160
Slava Avatar answered Oct 13 '22 09:10

Slava