Перегрузка < < оператор 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")
В общем, я бы избегал ссылаться на объекты, такие как регистратор (который вы обычно безоговорочно ожидаете присутствовать) через указатель из-за неопределенности, которую вы получаете с указателем, AKA есть объект или нет? р>
Другие советы
Вот способ:
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";
если это не то, что вы хотите, я бы пошел с Тимо Джеуш , даже если это некрасиво
В зависимости от контекста, из которого вы получаете регистратор, вы можете захотеть вернуть ссылку вместо указателя:
...
Logger& logger() {
return *_pLogger;
}
...
Logger& log = logger();
log << "...";
Не совсем. new log ()
имеет тип указателя, " Lexicon стартовый "
имеет тип const char [16]
. Вы можете перегружать операторы, только если хотя бы один аргумент имеет пользовательский тип.
decasteljau правильно заметил, что вы можете сделать это через (* log)
, если вам нужен указатель. Мне не нравится указатель, однако. Андрей Александреску посвящает немало страниц, посвященных интеллектуальным регистраторам в «Современном C ++ Design», возможно, стоит посоветоваться с этим.