在类之外明确声明构造函数

我试图通过假定只使用私有构造函数,类的私有实例和公共静态方法来实现单例模式来返回实例。 但是我在Visual Studio中遇到以下代码的错误

// Singleton Invoice
#include <iostream>
using namespace std;

class Singleton {
public:
  //Public Static method with return type of Class to access that instance.
  static Singleton* getInstance();
private:
  //Private Constructor
  Singleton();
  //Private Static Instance of Class
  static Singleton* objSingleton;
};

Singleton* Singleton::objSingleton = NULL;

Singleton* Singleton::getInstance() {
  if (objSingleton == NULL) {
    //Lazy Instantiation: if the instance is not needed it will never be created
    objSingleton = new Singleton();
    cout << "Object is created" << endl;
  }
  else
  {
    cout << "Object is already created" << endl;
  }
  return objSingleton;
}

int main() {
  Singleton::getInstance();
  Singleton::getInstance();
  Singleton::getInstance();
  return 0;
}

错误为:

LNK2019在函数“public:static class Singleton * __cdecl Singleton :: getInstance(void)”(?getInstance @ Singleton)中引用的未解析的外部符号“private:__thiscall Singleton :: Singleton(void)”(?? 0Singleton @@ AAE @ XZ) @@ SAPAV1 @ XZ)

然后我解决了错误,但在类之外重写了构造函数

Singleton::Singleton() {
}

我想知道错误的原因以及为什么需要在类之外明确写入构造函数。


在类中,构造函数只是被声明的,没有被定义。 定义包括一个功能体。 无论您是在课堂上还是在课堂外(如您所做的那样)将其定义为内联都无关紧要,但有一点不同之处在于,在课堂中定义时隐式inline


其他新闻:

  • 单身人士通过避免例如静态初始化次序失败来改善全局变量,但是对于无形的通信线路和副作用而言具有相同的问题。 最好避免。

  • 如果在相应的全局变量被销毁后不需要单例持久化,那么只需使用一个简单的Meyers单例。

  • 这是梅耶斯的单身人士:

    class Foo
    {
    private:
        Foo() {}
    public:
        static auto instance()
            -> Foo&
        {
            static Foo the_instance;
            return the_instance;
        }
    };
    

    默认的构造函数需要一个body:

    你可以改变

    Singleton();
    

    Singleton(){};
    

    在课堂上,它应该工作。


    在迈尔单身人士的演变中,我更喜欢价值语义单身人士,原因如下:

    class singleton
    {
      // private implementation
      struct impl {
        void do_something() { }
      };
    
      // private decision as to whether it's really a singleton and what its lifetime
      // will be
      static impl& instance() { static impl _impl; return _impl; }
    
    public:
      // public interface defers to private lifetime policy and implementation
      void do_something() { instance().do_something(); }
    };
    
    void something(singleton s)
    {
      s.do_something();
    }
    
    int main()
    {
      // we can now pass singletons by value which gives many benefits:
      // 1) if they later become non-singletons, the code does not have to change
      // 2) the implementation can be private so better encapsulation
      // 3) we can use them in ADL more effectively
      auto x = singleton();
      something(x);
      something(singleton());
    }
    
    链接地址: http://www.djcxy.com/p/78847.html

    上一篇: Explicitly stating a Constructor outside the class

    下一篇: Is Meyers' implementation of the Singleton pattern thread safe?