シングルトンをサブクラス化しようとしましたが、派生クラスのコンストラクタから印刷しようとしたときにエラーが発生しました。シングルトンサブクラスのコンストラクタエラー
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;
}
メインFUNC:
#include <iostream>
#include "mysingleton.h"
int main()
{
mysingleton *pointer = mysingleton::getinstance();
pointer->dosomething();
}
私は
mysingleton_childコンストラクタからの行のコメントを解除したとき、私は以下のエラーが出ます// std::cout <<"In Child Class \n";
エラー:
Error : Undefined symbols for architecture x86_64: "mysingleton::~mysingleton()", referenced from: mysingleton_child::mysingleton_child()
なぜ私はコンストラクタで何かを書くことができないのですか? 派生コンストラクタが呼び出されるか、または基本クラスコンストラクタだけが呼び出されますか? また、基本クラスのデストラクタをpublicにすると、すべて正常に動作しているようです。 しかし、私たちが公共のデストラクタを持っていれば、シングルトンを破壊するだろう。
説明で私を助けてください、私がより良く理解できるようにしてください。
あなたは誰もが直接あなたのシングルトンのインスタンスを取得することができ、このラインで
シングルトンはアンチパターン(栄光に輝いた大域変数)です。あなたがそれらについて忘れてしまったら、長期的にもっと幸せになるでしょう。シングルトンは使用しないでください。 –
* 'mysingleton'をサブクラス化していますか?それは基本的に「mysingle」のインスタンスが1つしかないという約束に違反します。 – user2357112
問題はシングルトンとは関係ありません。あなたが[mcve]を作成したなら、あなたはそれを見たでしょう。 – juanchopanza