I've implemented the singleton pattern like this, there is my code:
header file:
class Settings_manager{
public:
static Settings_manager& get_instance();
void operator=(Settings_manager const&) =delete;
Settings_manager(Settings_manager const&) =delete;
...
private:
Settings_manager();
};
implementation:
Settings_manager& Settings_manager::get_instance()
{
static Settings_manager instance;
return instance;
}
Settings_manager::Settings_manager()
{
read_file();
}
When I try use get_instance
function in main
like this:
Settings_manager set = Settings_manager::get_instance();
or Settings_manager set = std::move(Settings_manager::get_instance());
I get
error: use of deleted function 'Settings_manager::Settings_manager(const Settings_manager&)'
Settings_manager set = Settings_manager::get_instance();
Can somebody tell, what's wrong and explain it? Thanks.
Copy constructor (and assignment) should be defined when ever the implicitly generated one violates any class invariant. It should be defined as deleted when it cannot be written in a way that wouldn't have undesirable or surprising behaviour.
And deletion of singleton class object would be allow only when the count is zero. To design C++ delete singleton instance, first, we need to make the singleton class destructor private, so, it can not be accessed from outside of the class. Hence, user cannot delete the singleton instance using the keyword “delete”.
The constructor, copy constructor and assignment operator are all private to ensure that the programmer using the singleton class can only create a single instance of the class using only the Instance() function.
Because all the member functions of this class are static and the class has no instance variables, it is not required that the class be instantiated. The member functions can be used without an instance of the class. Thus there is no need to implement constructors or a destructor for this class.
Consider what you're trying to do here:
Settings_manager set = Settings_manager::get_instance();
You have your singleton, get_instance()
, and you're trying to copy it? That would kind of defeat the purpose of singleton if you could just... create two of them right?
You want to take a reference:
Settings_manager& set = Settings_manager::get_instance();
This way, set
is the singleton instance. Not a copy of it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With