单例模式实现出错

时间:2016-10-21 16:05:58

标签: c++ design-patterns

我看到像

这样的错误

src / singleton.cxx:16:错误:无效使用成员' Singleton :: instance'在静态成员函数中 src / singleton.cxx:28:错误:从这个位置 src / singleton.cxx:16:错误:无效使用成员' Singleton :: instance'在静态成员函数中 src / singleton.cxx:29:错误:从这个位置 src / singleton.cxx:16:错误:无效使用成员' Singleton :: instance'在静态成员函数中 src / singleton.cxx:31:错误:从这个位置 src / singleton.cxx:在函数' int main()':

现在进行更改后,我收到以下错误

singleton-rhel6.3.o:在函数Singleton::get_instance()': src/singleton.cxx:27: undefined reference to Singleton :: instance'

#include <cstddef>

class Singleton {

private:
  Singleton();
  static Singleton * instance;
  int m_num;
  int incr_call();

public :
  static Singleton * get_instance();

};

Singleton * Singleton::get_instance() {
  if(instance == NULL)
    instance = new Singleton();
  return instance;
}

Singleton::Singleton():
  m_num(0)
{
}

int Singleton::incr_call() {
  return m_num++;
}

int main() {
  Singleton * s = Singleton::get_instance();
  return 0;
}

2 个答案:

答案 0 :(得分:1)

instance应为static,因为您希望能够在get_instance中调用它。此外,instance应为private

class Singleton {

public :
  static Singleton * get_instance();


private:
  Singleton();
  static Singleton * instance;
  int m_num;
  int incr_call();

};
Singleton* Singleton::instance;

您也应该更改构造函数,以便不初始化instance

Singleton::Singleton():
  m_num(0)
{ }

由于instancestatic,因此默认初始化已完成,它将为NULL / nullptr

答案 1 :(得分:1)

如果你必须使用单身,请使用Meyers&#39;之一:

class Singleton {
private:
    Singleton() = default;
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

public :
    static Singleton& get_instance()
    {
        static Singleton instance;
        return instance;
    }

// Extra stuff
};