0

これはシングルトンパターンの例ですか?? そうでない場合、このクラスをロガーとして使用すると、何が問題になる可能性がありますか。(もちろん、完全に柔軟なロガーではありません)

#include <iostream>
#include <fstream>
using namespace std;


class logger
{
    private:
        static ofstream myfile;

        void openfile()
        {
            myfile.open ("example.txt");
        }
        void closefile()
        {
            myfile.close();
        }
    public:     
        void logit(string str)
        {
            if (myfile.is_open() == 1)
            {
                myfile << str << endl;
            }
            else
            {   
                openfile();
                myfile << str << endl;
            }   
        }
};

ofstream logger::myfile;
int main () 
{
    logger l;
    l.logit ("log from vod application");
    logger l2;
            l.logit ("log from guide application");

    logger l3;
    l1.logit ("log from application 3-1");
    l1.logit ("log from application 3-2");

            return 0;
}

どんな議論も役に立ちます。

デベシュ

4

3 に答える 3

3

いいえ、これはシングルトンではありません。

シングルトンを作成するには、コンストラクターをプライベートにする必要があります。クラスはコンストラクターを宣言していないため、コンパイラーはデフォルトのものを生成します。すべてのメンバーを少しずつ単純にコピーするコピー コンストラクターと代入演算子があるため、これは良くありません。開いているファイルのハンドルまたはポインタを割り当てられたメモリにコピーし、コピーを操作しようとすると、通常、悪いことが起こります。

class logger {
    static logger* the_logger;
    // other private members

    logger() : the_logger(NULL)
        { /*logger construction*/} 
public:
    static logger* logger::instance(const string& filename) {
        if (the_logger == NULL) {
            the_logger = new logger(/*arguments*/);
        }
        return the_logger;
    }

    static void cleanup(void) {
        delete the_logger;
    }
    /* other public members*/
    void debug(...)
}


int main(void) 
{
    logger::instance()->debug(blah-blah-blah);
    logger::cleanup();
}

簡単にするために、共有リソース (ファイル記述子または出力ストリーム) への同時アクセスに関連するコードは省略しました。

また、私の記憶が正しければ、静的メンバーは静的メンバー関数でしかアクセスできないため、コードはコンパイルされません。

于 2013-10-29T12:08:58.747 に答える