과부하 << 운영자 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")
일반적으로, 나는 포인터로 얻는 불확실성으로 인해 포인터를 통해 로거 (일반적으로 무조건적으로 존재할 것으로 예상되는)와 같은 물체를 참조하는 것을 부끄러워 할 것입니다.
다른 팁
방법은 다음과 같습니다.
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, 추악하더라도
로거를 얻는 컨텍스트에 따라 포인터 대신 참조를 반환 할 수 있습니다.
...
Logger& logger() {
return *_pLogger;
}
...
Logger& log = logger();
log << "...";
설마. new log( )
포인터 유형이 있고 "Lexicon starting"
유형이 있습니다 const char[16]
. 하나 이상의 인수에 사용자 정의 유형이있는 경우 오퍼레이터 만 과부하 할 수 있습니다.
DeCasteljau는 당신이 이것을 통해 이것을 할 수 있다고 올바르게 언급했습니다 (*log)
, 포인터를 원한다면. 그러나 나는 포인터가 마음에 들지 않습니다. Andrei Alexandrescu는 "Modern C ++ Design"의 Smart Logger Singletons에서 상당히 많은 페이지를 바칩니다.
제휴하지 않습니다 StackOverflow