C++ C++;单态模式

C++ C++;单态模式,c++,C++,考虑以下来自yolinux()的单例模式设计 #包括 类记录器{ 公众: 静态记录器*实例(); bool openLogFile(std::string日志文件); void writeToLogFile(); bool closeLogFile(); 私人: Logger(){};//私有,因此无法调用它 Logger(Logger const&){};//复制构造函数是私有的 Logger&operator=(Logger const&){};//赋值运算符是私有的 静态记录器*m_pIn

考虑以下来自yolinux()的单例模式设计

#包括
类记录器{
公众:
静态记录器*实例();
bool openLogFile(std::string日志文件);
void writeToLogFile();
bool closeLogFile();
私人:
Logger(){};//私有,因此无法调用它
Logger(Logger const&){};//复制构造函数是私有的
Logger&operator=(Logger const&){};//赋值运算符是私有的
静态记录器*m_pInstance;
};
有人能解释一下为什么
Logger(Logger const&){}
记录器&运算符=(记录器常数&){}吗?
提前感谢。

从您的链接:

This design pattern and methodology ensures that only one instance of the C++ class is instantiated.
Logger(Logger const&)
是允许复制对象的复制构造函数。这是错误的想法。
Logger&operator=(Logger&)
还允许从链接复制对象。

This design pattern and methodology ensures that only one instance of the C++ class is instantiated.
Logger(Logger const&)
是允许复制对象的复制构造函数。这是错误的想法。
Logger&operator=(Logger&)
还允许复制对象。

注释很好地解释了这一点


如果没有显式定义构造函数和复制构造函数,则默认情况下它们将创建为public。通过在这里定义它们,您可以确保它们是私有的,因此用户永远不能调用它们。

注释很好地解释了这一点


如果没有显式定义构造函数和复制构造函数,则默认情况下它们将创建为public。通过在此处定义它们,您可以确保它们是私有的,因此用户永远不能调用它们。

复制构造函数和左值分配运算符被声明为私有,以使类型不可复制

另一方面,我鼓励您使用Meyers singleton,而不是基于动态内存的:它更易于实现,而不是泄漏(请注意,严格来说,您的singleton泄漏内存,实例永远不会被删除),并且是线程安全的,如C++11标准内存模型中所定义:

T& instance()
{
    static T _instance;

    return _instance;
}

复制构造函数和左值赋值运算符被声明为private,以使类型不可复制

另一方面,我鼓励您使用Meyers singleton,而不是基于动态内存的:它更易于实现,而不是泄漏(请注意,严格来说,您的singleton泄漏内存,实例永远不会被删除),并且是线程安全的,如C++11标准内存模型中所定义:

T& instance()
{
    static T _instance;

    return _instance;
}

它们是复制构造函数和复制赋值运算符。如果它们没有定义为private,它们将自动生成为public,并且实例将是可复制的,这与Singleton模式相矛盾

由于采用了C++11标准,您还可以使用:

Logger(const Logger&) = delete;
Logger& operator=(const Logger&) = delete;

这种语法可能更清晰,而且还确保即使是好友和私人成员也不能复制对象。

它们是复制构造函数和复制赋值运算符。如果它们没有定义为private,它们将自动生成为public,并且实例将是可复制的,这与Singleton模式相矛盾

由于采用了C++11标准,您还可以使用:

Logger(const Logger&) = delete;
Logger& operator=(const Logger&) = delete;

此语法可能更清晰,并且还确保即使是好友和私人成员也不能复制对象。

如果强制复制构造函数和赋值运算符为私人,则无法编译两个记录器对象的赋值

这将导致链接器错误,该错误不是显式消息。 默认情况下会生成这些方法,因此必须强制它们为私有

在C++11中,他们使用删除的方法来获得更清晰的消息

   Logger(Logger const&)=delete;             // copy constructor does not exist
   Logger& operator=(Logger const&)=delete;  // assignment operator does not exist
delete不是强制性的,如果没有这个特性,singleton可以很好地工作,所以如果你的编译器不支持这个特性,你可以把它设为private。 此功能提供明确的错误消息,但不影响单例本身的行为

有关“删除”功能的更多信息,请查看:

还可以通过将析构函数设置为私有来防止对象被销毁


如果强制复制构造函数和赋值运算符为私有,则无法编译两个记录器对象的赋值

这将导致链接器错误,该错误不是显式消息。 默认情况下会生成这些方法,因此必须强制它们为私有

在C++11中,他们使用删除的方法来获得更清晰的消息

   Logger(Logger const&)=delete;             // copy constructor does not exist
   Logger& operator=(Logger const&)=delete;  // assignment operator does not exist
delete不是强制性的,如果没有这个特性,singleton可以很好地工作,所以如果你的编译器不支持这个特性,你可以把它设为private。 此功能提供明确的错误消息,但不影响单例本身的行为

有关“删除”功能的更多信息,请查看:

还可以通过将析构函数设置为私有来防止对象被销毁


实现单例行为的传统解决方案是将构造函数声明为私有。复制构造函数和赋值运算符(故意没有实现)被声明为私有,以防止生成任何类型的复制

•因为它们是私有的,这将导致任何试图使用它们但无法访问类的私有部分的人出现编译时错误


•剩下的朋友(以及类本身)将以未定义符号的形式出现错误,无论是在链接时(如果您在那里检查),还是在运行时(尝试加载库时)。

实现单例行为的传统解决方案是将构造函数声明为私有。复制构造函数和赋值运算符(故意没有实现)被声明为私有,以防止生成任何类型的复制

•因为它们是私有的,这将导致任何试图使用它们但无法访问其私有部分的人产生编译时错误