оператор «<<» на указатель - PullRequest
4 голосов
/ 31 марта 2011

У меня есть класс Terminallog, который перегружает оператор <<.Если я делаю следующее </p>

Terminallog clog(3);
clog << "stackoverflow.com is cool" << endl;

, все работает нормально.«stackoverflow.com - это круто» выводится на экран красивым цветным шрифтом, именно это и должен делать Terminallog.

Теперь я пытаюсь

Terminallog* clog = new Terminallog(3);
clog << "stackoverflow.com is cool" << endl;

, что приводит к ошибке компиляции:

error: invalid operands of types ‘Terminallog*’ and ‘const char [5]’ to binary ‘operator<<’

Я вижу, что это проблема передачи оператора "<<" вуказатель, но как я могу получить то же поведение, что и с не указателем версии?Я мог бы просто разыменовать указатель, но это создало бы локальную копию объекта (что не хорошо для производительности, не так ли?) </p>

Поэтому мне интересно, как правильно это сделать?

Заранее спасибо

ftiaronsem

Ответы [ 5 ]

8 голосов
/ 31 марта 2011

Разыменование указателя для записи

*clog << "My message" << endl;

не не создает копию объекта, на который указывает указатель. Как правило, разыменование указателя не делает копии, и единственный способ сделать копию - это либо создать ее явно, либо передать объект в функцию по значению, либо вернуть объект из функции по значению. Приведенный выше код с разыменованием указателя, вероятно, является тем, что вы ищете.

4 голосов
/ 31 марта 2011

Фактически разыменование указателя дает вам ссылку, а не копию, так что все в порядке. (В любом случае попытка скопировать поток и не удастся; потоки - это не контейнеры, а потоки данных.)

*clog << "text" << std::endl;

Вы не можете написать свободную ("глобальную") функцию operator<<, в которой указатель находится на TerminalLog слева, а остальные - справа, потому что для этого языка требуется хотя бы один из операндов. operator<< быть классом или типом перечисления, и ваш аргумент RHS часто не будет единичным.

2 голосов
/ 31 марта 2011

Разыменование указателя не создает копию, он создает ссылку. Вы можете просто де-ref его и получить правильное поведение, без копирования.

1 голос
/ 31 марта 2011
Terminallog* clog = new Terminallog(3);
Terminallog& clog_r = *clog;
clog_r << "stackoverflow.com is cool" << endl;
1 голос
/ 31 марта 2011

Простой: (*clog) << "stackoverflow.com is cool" << endl;

Это не создает копию clog.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...