3

如果我不想允许任何人创建我的类的实例,除了我的静态函数(我认为这被称为单例/工厂?),是否足以使默认构造函数私有,或者我还需要显式定义并使私有成为复制构造函数和赋值运算符?

4

4 回答 4

3

将构造函数设为私有是针对工厂方法模式的。单例模式需要一个工厂方法。
如果您不想复制您的课程,则 boost 是不可复制的,但正如 James McNellis 已经评论的那样:决定用户是否应该能够复制课程。因为原始指针和固有的内存管理不应该再在类中占有一席之地,所以复制类的问题主要针对使用资源或可能是大型容器的类。

于 2010-11-03T23:01:44.237 回答
2

是的,我会完成所有这 3 个管理器功能。如果没有,您不希望能够访问复制构造函数。例如,这是有效的:

Singleton * s;
Singleton copy( *s );

所以做类似的事情:

class Singleton
{
private:
  Singleton();
  Singleton(const Singleton &);
  Singleton & operator = (const Singleton &);
};
于 2010-11-03T22:46:28.047 回答
0

是的,通常你必须这样做。如果没有,您可以通过复制构造一个新对象:

MyClass newObject = your_singleton_of_type_MyClass;

在这种情况下,复制构造函数被发出,实际上创建了两个对象。将复制构造函数设为私有会通过使此代码非法来防止复制。

于 2010-11-03T22:43:13.617 回答
0

如果您只想要一个实例,那么是的,复制构造函数应该是私有的。赋值运算符无关紧要,因为无论如何它都无法使用。

于 2010-11-03T22:44:49.677 回答