0

C++ で Singleton クラスを実装しようとしていますが、少し混乱しています。わかりました、次の2つのクラスがあるとしましょう:

class Animal {

public:
    virtual int age() = 0;
    virtual void breed() = 0;   
};


class Cat : public Animal {
  public:
Cat();
int age();
void breed();  
};                

このシステムに関連するその他のクラス .... (犬、魚など)

これで、1 つのオブジェクトだけを使用できるシングルトン クラスができました。

class Singleton 
{
  public:
    Animal *newAnimal(string theTypeOfAnimal);
  private:   
   static Animal* pinstance;
};                        

Animal *Singleton::newAnimal(string theTypeOfAnimal)
{
pinstance = new Cat;

}           

int main()
{        
Singleton *s;
return 0;
}      

アップデート:

新しいコード:

#include <iostream>
using namespace std;

class Animal {

public:
    virtual int age() = 0;
    virtual void breed() = 0;
};

class Cat : public Animal
{
public:
        virtual int age() { return 9; }
        virtual void breed() { }

 };
class Singleton
{
public:
    Animal *newAnimal(string theTypeOfAnimal);
  private:   
   static Animal* pinstance;
};

Animal* Singleton::pinstance = 0;


Animal *Singleton::newAnimal(string theTypeOfAnimal)
{
     this->pinstance = new Cat;
 return pinstance;
}  

 int main(int argc, char *argv[]) {

Singleton s;

Animal *myAnimal = NULL;

Animal *myAnimal = s->newAnimal("cat");

}

4

3 に答える 3

1

その外側で静的クラス オブジェクトを定義する必要があります。

Animal* Singleton::pinstance = 0;

Catクラスで関数を定義する必要があります。

class Cat : public Animal
{
public:
    Cat() {}
    int age() { return 7; }
    void breed() {}
};
于 2012-10-28T00:23:40.277 に答える
1

静的メンバーを明示的に定義する必要があります。Animal *Singleton::pinstance = nullptr;

static Animal* pinstanceクラス内では単なる宣言です。つまり、変数に割り当てられる実空間はありません。その理由は、静的メンバーが特定のオブジェクトに属しておらず、ホスティング クラスのインスタンスに割り当てられていないためです。静的メンバーはすべてのクラス インスタンスで共有され、明示的に割り当てる必要があります。

于 2012-10-28T00:11:05.973 に答える
0

ターゲットのcalsからではなく、シングルトンから派生する必要があります。シングルトンはパターンです。テンプレートクラス(通常)または派生元の基本クラス(まれ)として実装できます。クラシックシングルトンには次のものがあります。

  • プライベートコンストラクター
  • プライベートコピーコンストラクタ
  • プライベート非仮想デストラクタ
  • プライベートオペレーター=
  • 自己オブジェクトへのポインタを保持します
  • オブジェクトを取得するための外部フレンド機能があります

できる:

  • ctor、cctor、dtor、およびoper =の実装がないため、派生クラスから呼び出そうとすると、リンケージエラーが発生します。
  • 子供を個人的に導き出す
  • レイジーオブジェクトの初期化
  • ...もっと

どちらの実装が優れているか、シングルトンが良いか悪いかについてのコンセンサスはありません。私の意見では、シングルトンは初心者にとって有用というよりも有害です。特定の場所で必要になることが確実になるまで、使用しないでください。

砂漠として、スマートポインタを備えた悪いシングルトンテンプレート(ホラーエラーを見つけてください!):

#include <memory> 
#include <boost/noncopyable.hpp>

template <class T>
class Singleton : public boost::noncopyable
{
public:
    static std::shared_ptr<T> Get()
    {
        if( m_pSelf.get() == 0 )
            return m_pSelf = std::shared_ptr<T>(new T());
        else 
            return m_pSelf;
    }


protected:
    Singleton(){}
    ~Singleton() {}

private:    
    static std::shared_ptr<T> m_pSelf;
};

template <class T> std::shared_ptr<T>  Singleton<T>::m_pSelf;
于 2012-10-27T22:54:18.750 に答える