4
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<<'
4

5 に答える 5

12

ロガーオブジェクトへのポインターを逆参照し、それが0でないかどうかを明らかに確認する必要があります。次のようなものが仕事をするはずです:


  log && ((*log) << "Lexicon starting")

一般的なことはさておき、ポインターで取得する不確実性のために、ポインターを介してロガー (通常は無条件に存在すると予想される) のようなオブジェクトを参照することを避けます。別名、オブジェクトがあるかどうか?

于 2009-03-09T13:24:57.373 に答える
9

方法は次のとおりです。

logger * log = new log();
(*log) << "Lexicon Starting";
于 2009-03-09T13:24:26.003 に答える
5

なぜ参照を使用しないのですか?

logger & log = *(new log()); 
// the above is abhorrent code that 
// should be replaced by something meaningful

log << "Lexicon Starting";

これがあなたの望んでいるものではない場合、私はTimo Geuschに行きます。たとえそれが醜くても

于 2009-03-09T13:30:14.397 に答える
2

ロガーを取得するコンテキストによっては、ポインターの代わりに参照を返したい場合があります。

...
Logger& logger() {
    return *_pLogger;
}
...

Logger& log = logger();
log << "...";
于 2009-03-09T13:28:59.253 に答える
2

あまり。new log( )ポインタ型を"Lexicon starting"持ち、型を持ちますconst char[16]。少なくとも 1 つの引数にユーザー定義型がある場合にのみ、演算子をオーバーロードできます。

(*log)decasteljauは、ポインターが必要な場合はを介し​​てこれを行うことができると正しく指摘しました。しかし、私はポインタが好きではありません。Andrei Alexandrescu は、"Modern C++ Design" でスマート ロガー シングルトンに関するかなりのページを割いており、参照する価値があるかもしれません。

于 2009-03-09T13:29:48.953 に答える