Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用new关键字限制实例数_C++_Singleton_Overriding_New Operator - Fatal编程技术网

C++ 使用new关键字限制实例数

C++ 使用new关键字限制实例数,c++,singleton,overriding,new-operator,C++,Singleton,Overriding,New Operator,我读了很多关于单身模式是否好/坏/丑的争论,以及应该用什么来代替它 通用实现需要一个Instance()方法,该方法在对象尚未创建时调用私有构造函数 我的问题并不真正符合单例模式,但是否可以通过覆盖new来限制类的实例数?如果说我们只需要一个实例,返回已经创建的实例 如果可能的话,这是个好主意吗 这样做的目的是,在任何需要访问类的类中,只需声明一个私有成员,该成员将在第一次初始化时被初始化,然后在其余部分被引用 ClassA { MyClass classRef; } ClassB {

我读了很多关于单身模式是否好/坏/丑的争论,以及应该用什么来代替它

通用实现需要一个
Instance()
方法,该方法在对象尚未创建时调用私有构造函数

我的问题并不真正符合单例模式,但是否可以通过覆盖
new
来限制类的实例数?如果说我们只需要一个实例,返回已经创建的实例

如果可能的话,这是个好主意吗

这样做的目的是,在任何需要访问类的类中,只需声明一个私有成员,该成员将在第一次初始化时被初始化,然后在其余部分被引用

ClassA {
    MyClass classRef;
}

ClassB {
    MyClass classRef;
}

因此,如果
MyClass
被限制为一个实例,取决于实例的顺序,这些对象中的一个将实际创建一个新的MyClass,而另一个将只获取它的引用。

这听起来像是某种非并发的

当大量作业将由多个服务/驱动程序执行,并且您想要实现节流,或者可能要对作业进行排队以防止交换文件抖动,或者其他一些资源约束时,这可能是一个好主意


覆盖
new
可能不是正确的方法。让任务场本身成为一个对象,并从那里“分配”任务。任务句柄包装器对象的原始分配不应考虑这些因素


是的,单例是丑陋的(或者至少是一个好主意的丑陋实现)。

对象可以在堆栈上和其他对象内静态分配。如果您只想要一个实例,那么您需要以某种方式禁止所有这些。重载
operator new
对您没有帮助。使构造函数
私有
受保护
将被禁用,但这也将为类的用户禁用
操作符new


此外,
operator new
返回的不是对象,而是将在其中创建对象的块内存。如果您返回一个已经分配的块,每次调用
操作符new
时,构造函数都会在该块上运行。

重写
new
将不起作用。首先,它不会阻止额外的 堆栈上的实例或作为静态变量的实例。其次是
操作符
您定义的新
仅分配内存;构造函数仍将 被调用(如果单例
可变状态)

通过将计数器作为静态成员变量,可以更直接地限制实例化的数量:

template<unsigned int N>
class N_gleton {
  private:
    static int number_of_instances_;

  public:
    enum { MAX_NUMBER_OF_INSTANCES = N };

    N_gleton() {
      assert(number_of_instances_ < MAX_NUMBER_OF_INSTANCES);
      ++number_of_instances_;
    }
};

template<unsigned int N>
int N_gleton<N>::number_of_instances_ = 0;  // initial value
模板
N_gleton类{
私人:
实例的静态整数个数;
公众:
枚举{MAX_NUMBER_OF_INSTANCES=N};
N_gleton(){
断言(实例的数量<实例的最大数量);
++_实例的数量;
}
};
模板
int N_gleton::实例的数量=0;//初始值

如果您真的需要限制到一个实例,我建议单例模式的效果会更好。它肯定会更易于维护。