所以在我的程序中我有一些类 - Button,Window和WindowButton。按钮仅包含文本,窗口 - 按钮和坐标(x,y),WindowButton由窗口组成。 在WindowButton中,我重载了<<像这样的运算符:
ostream& operator<<(ostream& out, WindowButton& ref)
{
ref.print();
return out;
}
打印功能如下:
void WindowButton::print()
{
theWindow->print();
}
窗口打印功能,在窗口类中:
void Window::print()
{
char* buttonText = button->getText();
char* theText = new char[strlen(buttonText)+1];
strcpy(theText, buttonText);
cout << endl << "Window with coordinates (" << this->coord.x << "," << this->coord.y << ") , and button text \"" << theText << "\"" << endl;
}
主要:
WindowButton *test = new WindowButton();
cout << endl << test;
test->print();
最后一行提供正确的输出,但第二行仅提供内存地址。我究竟做错了什么?一切都应该工作正常,因为test-&gt; print();工作正常。
答案 0 :(得分:4)
您正在将指针传递给operator&lt;&lt;期待&amp;。
cout << endl << *test;
您也可以成功:
ostream& operator<<(ostream& out, const WindowButton& ref){
假设打印实际上没有修改。
但是,更大的问题是为什么使用cout
ostream来触发打印到theWindow
- 这些似乎是(虽然不是)逻辑上断开的进程。您可以将给定的流传递给Window :: print:
void Window::print(ostream& stream) {
并使用该流代替cout
。这样可以避免将cout
硬编码到Window::print()
。
答案 1 :(得分:1)
它是一个指针,因此您需要取消引用它才能让操作符起作用:
cout << endl << *test;
答案 2 :(得分:1)
这一行
cout << endl << test;
打印一个指向WindowButton
的指针,指针有一个ostream& operator<<
专门化,用于打印地址。您可以尝试取消引用指针:
cout << endl << (*test);
顺便说一句,以最终只打印到ostream& operator<<
的方式重载std::cout
几乎没有意义。这样一个运算符的意思是你可以流式传输到任何 ostream
,而不仅仅是cout
。您可以修改print
函数以通过引用获取ostream
并修改它来解决此问题:
void WindowButton::print(std::ostream& out) const {
theWindow->print(out);
}
和
void Window::print(ostream& out) const {
// stuff
out << "Window with coordinates (" << this->coord.x << "," << this->coord.y << ") , and button text \"" << theText << "\"" << endl;
}
最后
ostream& operator<<(ostream& out, const WindowButton& ref){
ref.print(out);
return out;
}