C++ 单例初始化

C++ 单例初始化,c++,singleton,private-members,C++,Singleton,Private Members,我在代码中实现了 假设是: class Singleton { Singleton () {} static Singleton* s; public: static Singleton* Get () { if (!s) s = new Singleton (); return s; } }; 让我困惑的是这个模式的“初始化”。 在.cpp中,我放了: SingletonPointer* SingletonClass::s (0); 但我不明白如

我在代码中实现了

假设是:

class Singleton
{
  Singleton () {}
  static Singleton* s;
public:
  static Singleton* Get () {
    if (!s)
      s = new Singleton ();
    return s;
  }
};
让我困惑的是这个模式的“初始化”。 在.cpp中,我放了:

SingletonPointer* SingletonClass::s (0);
但我不明白如何才能访问define
s
,因为它是
私有的
。 怎么可能呢

蒂亚,
Jir

在初始化代码中,您没有访问
Singleton::s
,您正在定义它。

在初始化代码中,您没有访问
Singleton::s
,您正在定义它。

它是通过
Get
从外部访问的(如果您指定了适当的类型)。它是私有的这一事实并不妨碍该方法返回指向它的指针。私有的成员只会阻止通过名称访问它。

它是通过
Get
从外部访问的(如果您指定了适当的类型)。它是私有的这一事实并不妨碍该方法返回指向它的指针。私有成员只会阻止通过名称访问它。

使用单例模式的最佳方法是根本不使用它

关于单身人士为何不好的简要概述:

  • 他们是有特殊限制的全球人。全球人之所以糟糕,是因为他们自己的原因;让他们成为单身汉只会放大坏的一面
  • 如果你真的只需要一个对象的实例,那么就做一个。如果您需要一个特殊的设备来确保您不会制作多个,那么代码的语义就有问题。让它成为单身并不能解决问题,它只是用新的问题来掩盖它
  • 单身汉不喜欢玩线程。线已经够硬了。不要让他们更难

  • 使用单例不能解决任何问题。它只是将错误的语义应用于现有代码,使该代码的未来扩展变得困难或不可能(如果明天需要两个呢?),并添加新的问题。长话短说,就是不要使用它们。

    使用单例模式的最好方法是根本不使用它

    关于单身人士为何不好的简要概述:

  • 他们是有特殊限制的全球人。全球人之所以糟糕,是因为他们自己的原因;让他们成为单身汉只会放大坏的一面
  • 如果你真的只需要一个对象的实例,那么就做一个。如果您需要一个特殊的设备来确保您不会制作多个,那么代码的语义就有问题。让它成为单身并不能解决问题,它只是用新的问题来掩盖它
  • 单身汉不喜欢玩线程。线已经够硬了。不要让他们更难

  • 使用单例不能解决任何问题。它只是将错误的语义应用于现有代码,使该代码的未来扩展变得困难或不可能(如果明天需要两个呢?),并添加新的问题。长话短说,就是不要使用它们。

    一个类的所有方法都可以访问私有变量。访问s变量的唯一位置是属于同一类的Get()方法

    如果要从外部访问s,不能直接访问,但必须调用Get()方法(它是公共的),该方法实际上会为您返回s

    用法:

    Singleton * s = SingletonClass::Get();
    

    私有变量可以被一个类的所有方法访问。访问s变量的唯一位置是属于同一类的Get()方法

    如果要从外部访问s,不能直接访问,但必须调用Get()方法(它是公共的),该方法实际上会为您返回s

    用法:

    Singleton * s = SingletonClass::Get();
    

    除了声明之外,静态字段还必须有定义。声明通常放在.h文件的类声明中,而定义几乎总是放在.cpp文件中。静态变量的定义是必须的,因为它们必须初始化为某个对象

    但是,即使定义在类主体之外,甚至在完全不同的文件中,也不意味着它不是类的一部分。
    SingletonClass::
    使其成为类定义的一部分(与类声明相反),因此它可以“访问”私有字段

    在类主体之外定义的方法也是如此,例如:

    // A.h
    class A
    {
    private:
        int b;
    public:
        A(int x) : b(x)
        {}
    
        Do();
    }
    
    // A.cpp
    A::Do()
    {
        return b;
    }
    

    除了声明之外,静态字段还必须有定义。声明通常放在.h文件的类声明中,而定义几乎总是放在.cpp文件中。静态变量的定义是必须的,因为它们必须初始化为某个对象

    但是,即使定义在类主体之外,甚至在完全不同的文件中,也不意味着它不是类的一部分。
    SingletonClass::
    使其成为类定义的一部分(与类声明相反),因此它可以“访问”私有字段

    在类主体之外定义的方法也是如此,例如:

    // A.h
    class A
    {
    private:
        int b;
    public:
        A(int x) : b(x)
        {}
    
        Do();
    }
    
    // A.cpp
    A::Do()
    {
        return b;
    }
    

    为什么要从
    void
    函数返回值?;)哎呀!我想如果我复制n'pasted:D会更好谢谢你指出。我马上就来。为什么要从
    void
    函数返回值?;)哎呀!我想如果我复制n'pasted:D会更好谢谢你指出。我马上去拿。重点是:这是关于定义,而不是访问。尽管如此,如果它是私有的,怎么可能在类之外定义它呢?要点是:它是关于定义的,而不是访问的。但是,如果它是私有的,那么如何在类之外定义它呢?现在很清楚了。谢谢你的解释。我没有想到我们在定义类方法时总是这样做。现在很清楚了。谢谢你的解释。我没有想到我们在定义类方法时总是这样做。@RedX:我对这样一篇文章很感兴趣,我知道很多缺点