문제

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에서 상당히 많은 페이지를 바칩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top