オーバーロード<<演算子C ++-クラスへのポインター
-
06-07-2019 - |
質問
class logger {
....
};
logger& operator<<(logger& log, const std::string& str)
{
cout << "My Log: " << str << endl;
return log;
}
logger log;
log << "Lexicon Starting";
正常に動作しますが、代わりにクラスインスタンスへのポインタを使用したいと思います。すなわち
logger * log = new log();
log << "Lexicon Starting";
これは可能ですか?もしそうなら、構文は何ですか?ありがとう
編集:コンパイラエラーは
error: invalid operands of types 'logger*' and 'const char [17]' to binary 'operator<<'
解決
ロガーオブジェクトへのポインターを逆参照し、明らかに0でないかどうかを確認する必要があります。このような処理が必要です。
log && ((*log) << "Lexicon starting")
一般的には、ロガー(通常は無条件に存在することを期待します)のようなオブジェクトをポインターを介して参照することは避けます。 / p>
他のヒント
方法は次のとおりです。
logger * log = new log();
(*log) << "Lexicon Starting";
参照を使用しない理由
logger & log = *(new log());
// the above is abhorrent code that
// should be replaced by something meaningful
log << "Lexicon Starting";
これがあなたの望むものではない場合、 Timo Geusch 、たとえugくても
ロガーを取得するコンテキストに応じて、ポインターの代わりに参照を返したい場合があります。
...
Logger& logger() {
return *_pLogger;
}
...
Logger& log = logger();
log << "...";
そうでもない。 new log()
のポインタータイプ、&quot; Lexicon starting&quot;
のタイプは const char [16]
です。少なくとも1つの引数にユーザー定義型がある場合にのみ、演算子をオーバーロードできます。
decasteljauは、ポインターが必要な場合は、(* log)
を使用してこれを実行できると正しく述べました。しかし、私はポインターが好きではありません。 Andrei Alexandrescuは、「Modern C ++ Design」のスマートロガーシングルトンに関するかなりの数のページに専念しています。
所属していません StackOverflow