2016-11-23 6 views
-2

シングルトンをサブクラス化しようとしましたが、派生クラスのコンストラクタから印刷しようとしたときにエラーが発生しました。シングルトンサブクラスのコンストラクタエラー

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にすると、すべて正常に動作しているようです。 しかし、私たちが公共のデストラクタを持っていれば、シングルトンを破壊するだろう。

説明で私を助けてください、私がより良く理解できるようにしてください。

あなたは誰もが直接あなたのシングルトンのインスタンスを取得することができ、このラインで
+1

シングルトンはアンチパターン(栄光に輝いた大域変数)です。あなたがそれらについて忘れてしまったら、長期的にもっと幸せになるでしょう。シングルトンは使用しないでください。 –

+2

* 'mysingleton'をサブクラス化していますか?それは基本的に「mysingle」のインスタンスが1つしかないという約束に違反します。 – user2357112

+0

問題はシングルトンとは関係ありません。あなたが[mcve]を作成したなら、あなたはそれを見たでしょう。 – juanchopanza

答えて

1

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

だから、次の行は意味がありません。

static mysingleton* getinstance(); 

をしかし、問題は、あなたが宣言したということですコピーコンストラクタとデストラクタを作成しましたが、.cppファイルで定義していませんでした:

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

Y ouも普通のコンストラクタを宣言し、それをpublicにしました。それは間違い。 Gang of Four本を読んで、シングルトンをよりよく理解することができます。シングルトンが悪い理由については、StackOverflowの記事も読んでください。ちょうどGoogleの "シングルトンスタックのオーバーフローが悪い"。

+0

なぜですか?そのインスタンスを取得しようとしている静的な関数ですか?だから機能は必要ない?シングルトンに静的関数が必要ない理由を説明してください。 – user2256825

+0

シングルトンのインスタンスを取得するには、静的関数が必要です。しかし、インスタンスへのポインタをpublicメンバとして宣言する必要はありません。通常、それはプライベートとして宣言されています。 –

0

クラス定義で〜mysingleton()と〜mysingleton_child()を宣言しているので、それらを定義する必要があります。

関連する問題