Перегрузка << оператор C ++ - указатель на класс - PullRequest
3 голосов
/ 09 марта 2009
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<<'

Ответы [ 5 ]

11 голосов
/ 09 марта 2009

Вы должны разыменовать указатель на ваш объект регистратора и, очевидно, проверить, не равен ли он 0. Что-то вроде этого должно сделать работу:


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

В целом, я бы избегал ссылаться на объекты, такие как регистратор (который вы обычно безоговорочно ожидаете присутствовать) через указатель из-за неопределенности, которую вы получаете с указателем, AKA есть объект или нет?

9 голосов
/ 09 марта 2009

Вот путь:

logger * log = new log();
(*log) << "Lexicon Starting";
5 голосов
/ 09 марта 2009

Почему бы не использовать ссылку?

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

log << "Lexicon Starting";

если это не то, что вы хотите, я бы пошел с Тимо Гойшем , даже если это некрасиво

2 голосов
/ 09 марта 2009

Не совсем. new log( ) имеет тип указателя, "Lexicon starting" имеет тип const char[16]. Вы можете перегружать операторы, только если хотя бы один аргумент имеет определенный пользователем тип.

decasteljau правильно заметил, что вы можете сделать это через (*log), если вам нужен указатель. Мне не нравится указатель, однако. Андрей Александреску посвящает немало страниц, посвященных синглтонам умных логгеров, в «Современном C ++ Design», возможно, стоит посоветоваться с этим.

2 голосов
/ 09 марта 2009

В зависимости от контекста, из которого вы получаете регистратор, вы можете захотеть вернуть ссылку вместо указателя:

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

Logger& log = logger();
log << "...";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...