单例子类构造函数错误

时间:2016-11-23 22:54:30

标签: c++ c++11 singleton

我试图将单例子类化,当我尝试从派生类构造函数中打印时,我遇到了错误。

mysingleton.h

#ifndef mysingleton_h
#define mysingleton_h
#include <iostream>
class mysingleton{
  public:
   static mysingleton* singletoninstance; //The one and only one instance
   static mysingleton* getinstance();
   virtual void dosomething() = 0 ;

 protected:
   mysingleton(const mysingleton&);
   ~mysingleton();

   public:
      mysingleton(){

      }//Prevent clients from creating new singleton

   };



class mysingleton_child:public mysingleton
{
  public:
    virtual void dosomething() {
       std::cout <<"In Child Class \n";
     }
    mysingleton_child()
   {
    //   std::cout <<"In Child Class \n";

   }
~mysingleton_child();
};

mysingleton.cpp

#include "mysingleton.h"
mysingleton* mysingleton::singletoninstance = 0;

mysingleton* mysingleton ::  getinstance()
{
  if( !singletoninstance )
    singletoninstance = new  mysingleton_child();
  return singletoninstance;  
}

主要功能:

#include <iostream>
#include "mysingleton.h"
int main ()
{
   mysingleton *pointer  = mysingleton::getinstance();
   pointer->dosomething();
}

当我取消注释mysingleton_child构造函数

中的行时,出现以下错误
  

// std :: cout&lt;&lt;“在Child Class \ n”;

错误:

  

错误:架构x86_64的未定义符号:   “mysingleton :: ~mysingleton()”,引自:     mysingleton_child :: mysingleton_child()

为什么我无法在构造函数中编写任何内容? 是调用派生构造函数,还是仅调用基类构造函数? 此外,当我使基类析构函数公开时,一切似乎都工作正常。 但是,如果我们有一个公共析构函数,任何人都会破坏单例。

你可以帮我解释一下,让我更好地理解。

2 个答案:

答案 0 :(得分:1)

在这一行中,您允许每个人直接获取单身实例:

static mysingleton* singletoninstance; //The one and only one instance

所以下一行没有意义:

static mysingleton* getinstance();

但问题是您声明了复制构造函数和析构函数,但没有在.cpp文件中定义它们:

mysingleton(const mysingleton&);
   ~mysingleton();

您还声明了普通构造函数并将其设为public。这是一个错误。你可以查看Gang of Four本书来更好地理解单身人士。另请阅读StackOverflow文章,了解为什么单身人士会变坏。只是google&#34;单身堆栈溢出不好&#34;。

答案 1 :(得分:0)

由于你已经在类定义中声明了~myingleton()和~myingleton_child(),你应该提供它们的定义。