C ++重载运算符<<输出地址

时间:2012-09-16 21:39:14

标签: c++ overloading

所以在我的程序中我有一些类 - 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();工作正常。

3 个答案:

答案 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;
}