C++いくつかの特殊なクラスの設計

8108 ワード


一、スタックにしか空間を割り当てられないクラスを設計する
クラスのopeator new操作を書き換え、privateと宣言します.大まかなコードは次のとおりです.
class StackOnly
{
    public:
        StackOnly(){/*constructor*/}
        ~StackOnly(){/*destructor*/};
    private:
        void *operator new(size_t size);
};
 
int main()
{
    StackOnly s; //    ,           
 
    StackOnly * ps = new StackOnly(); //  ,  new       operator new         
    return 0;
}

これは面接問題で、反応速度と知識の習得の熟知度を考察していますが、この問題も少し迷っています.多くの人がnew operatorを書き換えたいと思っていますが、new operatorの下層がどのようにこの死の循環を実現するかに陥り、このような使い方は他の類と同じように、下層がメモリを取得する方法が変わっただけだと勘違いしています.しかし、実際にはnewという声明方式を使用してはいけないだけです.
二、スタックにメモリしか割り当てられないクラスを設計する
この問題はスタックにしか空間を割り当てることができないクラスを設計するのと同じ考え方であり、スタックにしか空間を割り当てることができないことはA*pa=new A(...)しかないことを意味する.この形式でメモリを取得し、A aを通過することはできません.この形式で取得します.構造関数をprotectedまたはprivateと宣言すると、A aを使用すると、このメモリ取得方式では、構造関数呼び出しエラーが発生します.次に、対応するコードは次のとおりです.
class HeapOnly
{
    public:
        HeapOnly(){/*constructor*/};
        void destroy(){/*do things ought to be done by destructor*/}
    private:
        ~HeapOnly(){/*destructor*/}
};
 
int main()
{
    HeapOnly h ; //    ,        
    HeapOnly *ph = new HeapOnly(); //    
    ph->destroy(); //          ,         
}

三、継承できないクラスを設計する
このようなコンストラクション関数を私有化すると、サブクラスは親のコンストラクション関数を呼び出すことができず、親の部分を構築することはできませんが、これではこのクラスを正常に使用することはできません.正常にコンストラクション関数を構築することができないため、次のような方法でクラスを実現することができます.
class NoInheritance
{
    public:
        static NoInheritance * getInstance(){return new NoInheritance();}
        static void destroy(NoInheritance * pN){delete pN; };
    private:
        NoInheritance();
        ~NoInheritance();
};
 
int main()
{
    NoInheritance *ni = NoInheritance.getInstance();
    NoInheritance.destroy(ni);
    return 0;
}

 
以上は確かに実行可能な案ですが、残念ながら使い勝手が悪く、友元の概念を利用して継承できない良いクラスを実現することができます.以下のようにします.
class NoHeritance
{
    private:
        NoHeritance();
        ~NoHeritance();
        friend class CBase;
};
 
class CBase:virtual public NoHeritance
{
    public:
        CBase();
        ~CBase();
    private:
        //members
}

 
虚ベースクラスは最終的には最終サブクラスのみで構成され、CBaseは虚ベースクラスNoHeritanceの友元としてprivate関数を呼び出すことができるが、友元の性質は継承されず、ChildがCBaseを継承したい場合はNoHeritanceの構造関数を呼び出す必要があり、これは通用しないため、継承できないクラスを構築した.(参考:http://blog.csdn.net/doudou745/article/details/7277164)
四、1つのインスタンスしかないクラスを設計する
これは典型的な設計モード、単例モードです.マルチスレッドセキュリティを考慮しない場合、大まかなコードは次のとおりです.
#include<iostream>
using namespace std;
 
class Singleton
{
public:
    static Singleton * GetInstance()//                 
    {
        if(m_pInstance==NULL)
        m_pInstance=new Singleton();
        return m_pInstance;
    }
 
private:
    Singleton(){}//                         
    static Singleton * m_pInstance;
    class Garbo//  Singleton     
    {
    public:
        ~Garbo()
        {
            if(Singleton::m_pInstance)
            {
                delete Singleton::m_pInstance;
            }
        }
    };
    static Garbo gb;//      ,           
};
Singleton * Singleton::m_pInstance=NULL;//         
 
int main()
{
    Singleton *sl=Singleton::GetInstance();
    return 0;
}