私はロギングファクトリを実装しようとしています。私は好きなときにいつでもロガーをスワップできます。ここコピー不可能な機能を持つインターフェイス
インターフェイス
class ILogger
{
public:
//Only allow string input. The entire ARC is going to be non-unicode.
virtual void log(std::string message, eLogLevel level=DEBUG) = 0;
protected:
virtual ~ILogger(void){};
private:
// No one can create an ILogger as it is abstract but should also
// disallow copying... why copy a logger? Only one per file. Besides want to
// force people to use the factory.
/*ILogger(const ILogger&);
ILogger& operator=(const ILogger&);*/ // REMOVED THIS BECAUSE OF ERROR
};
そして、ここでは、派生クラス(ヘッダ)
class GenericLoggerImpl :
public ILogger
{
public:
virtual ~GenericLoggerImpl(void);
virtual void log(std::string message, eLogLevel level=DEBUG);
private:
GenericLoggerImpl(void); //USE THE FACTORY
std::tr1::shared_ptr<GenericLogger> pImpl; //This is the implementation
friend class LoggerFactory; // class LoggerFactory can now build these
};
れ、CPP
GenericLoggerImpl::GenericLoggerImpl(void):pImpl()
{
pImpl = std::tr1::shared_ptr<GenericLogger> (new GenericLogger()); //This is the implementation
}
GenericLoggerImpl::~GenericLoggerImpl(void)
{
}
void GenericLoggerImpl::log(std::string message, eLogLevel level)
{
pImpl->logMsg(message.c_str(),level);
}
が今ここに問題があります。 ILoggerインターフェースを参照して、コードのプライベートセクションをコメントアウトしましたか?それは、ILogger派生クラスをコピーする人(boost :: noncopyableのように)を止めることを意図しています。これは、別のインスタンスのロガーが同じファイルにアクセスできないようにして、ユーザーが自分の便利なLoggerFactoryを通過できるようにする(私にとってはとにかく)意味があります。
これらの行が含まれている場合、私は次のエラーを取得する:
genericloggerimpl.cpp(6) : error C2512: 'ILogger' : no appropriate default constructor available
に関することは何ですか?私はこれらのオブジェクトをコピー可能にしたくありません。どうやってやるの?
もう一度コンパイルする前に保存しましたか?そして私はあなたのコードで実際にILogger(サブ)オブジェクトを構築する呼び出しをどの部分が理解しているのか分かりません。 'GenericLogger'クラスはどのようなものですか? – Mahesh
@Mahesh - 私は、いくつかの作成機能を提供する別々のLoggerFactoryオブジェクトを持っています。これは、実装クラスGenericLoggerImplの友人であることがわかります。 GenericLoggerはロギングクラスですが、かなり複雑です。 GenericLoggerImplはそのクラスのアダプターのように動作すると考えることができます。あるいは、GenericLoggerImplはILoggerであり、GenericLoggerの観点から実装されています。 – Dennis