我试图将单例子类化,当我尝试从派生类构造函数中打印时,我遇到了错误。
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()
为什么我无法在构造函数中编写任何内容? 是调用派生构造函数,还是仅调用基类构造函数? 此外,当我使基类析构函数公开时,一切似乎都工作正常。 但是,如果我们有一个公共析构函数,任何人都会破坏单例。
你可以帮我解释一下,让我更好地理解。
答案 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(),你应该提供它们的定义。