c ++ Singleton by reference use

hlx*_*007 2 c++ singleton

我已经阅读了 StackOverflow 中的一些 wiki,并为我的 Randomizer 类编写了以下头文件:

class Randomizer
{
    public:
        static Randomizer& instance(void);
        int nextInt(int);
        int nextInt(int, int);
        int die(int);
        double nextDouble(void);
        char randomChar(const std::string&);
    private:
        Randomizer(void) {};
        /* No implementation of the following methods */
        Randomizer(Randomizer const&);
        void operator= (Randomizer const&);
};
Run Code Online (Sandbox Code Playgroud)

我还在类内部实现了一些方法,例如 nextInt 等。

我不确定如何创建这个 Singleton 类的实例,即如何在 main() 中编写测试驱动器?

我试过:

int main()
{
     Randomizer r;
     r = Randomizer::instance();
}
Run Code Online (Sandbox Code Playgroud)

编译器说几个错误:

In file included from Randomizer.cpp:11:0:
Randomizer.h: In function ‘int main(int, char**)’:
Randomizer.h:22:9: error: ‘Randomizer::Randomizer()’ is private
         Randomizer(void) {};
         ^
Randomizer.cpp:56:16: error: within this context
     Randomizer r;
                ^
In file included from Randomizer.cpp:11:0:
Randomizer.h:25:14: error: ‘void Randomizer::operator=(const Randomizer&)’ is private
         void operator= (Randomizer const&);
              ^
Randomizer.cpp:57:7: error: within this context
     r = Randomizer::instance();
       ^
Run Code Online (Sandbox Code Playgroud)

感谢帮助。

Den*_*ant 5

此代码尝试复制 Randomizer 实例。如果不想直接使用instance()调用的结果,则应该取返回的引用:

Randomizer &r = Randomizer::instance();
Run Code Online (Sandbox Code Playgroud)


Jac*_*ack 5

你是说你想要一个单身人士,但是:

Randomizer r; 
Run Code Online (Sandbox Code Playgroud)

Randomizer通过尝试调用默认的空构造函数来构造一个新实例。所以你没有将它用作单例,此外你还声明了构造函数私有。

r = Randomizer::instance();
Run Code Online (Sandbox Code Playgroud)

在这里,您试图将一个单例复制分配给另一个您明确声明为私有的单例。

也许您打算使用:

Randomizer &r = Randomizer::instance()
Run Code Online (Sandbox Code Playgroud)

const Randomizer& instance()如果随机化器本身没有可见状态,那么拥有一个方法而不是可变引用可能也更好。