我有一个类Terminallog,它正在重载<<运营商。如果我做以下
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<<’
我可以看到传递“&lt;&lt;”的问题操作符指向一个指针,但是如何获得与非指针版本相同的行为?我可以简单地取消引用指针,但这会创建一个对象的本地副本(这对性能没有好处不是吗?)
因此我想知道这样做的正确方法是什么?
提前致谢
ftiaronsem
答案 0 :(得分:8)
取消引用写入
的指针*clog << "My message" << endl;
不创建指向的对象的副本。通常,指针解除引用不会复制,并且复制的唯一方法是显式创建一个,通过值将对象传递给函数,或者按值从函数返回一个对象。带有指针取消引用的上述代码可能就是你要找的。 p>
答案 1 :(得分:4)
实际上取消引用指针会给你一个参考,而不是一个副本,所以你没事。 (尝试复制流将并且失败,无论如何;流不是容器而是数据流。)
*clog << "text" << std::endl;
你不能写一个免费的(“全局”)函数operator<<
,左边是指针 - TerminalLog
,右边是其他东西,因为语言需要至少一个operator<<
的操作数是一个类或枚举类型,你的RHS参数通常不会是一个。
答案 2 :(得分:2)
取消引用指针不会创建副本,它会创建引用。你可以解除它并取得正确的行为,不需要复制。
答案 3 :(得分:1)
简单:(*clog) << "stackoverflow.com is cool" << endl;
这不会创建clog
的副本。
答案 4 :(得分:1)
Terminallog* clog = new Terminallog(3);
Terminallog& clog_r = *clog;
clog_r << "stackoverflow.com is cool" << endl;