1

所以在我的程序中,我有一些类——Button、Window 和 WindowButton。Button 仅由文本组成,Window - 由按钮和坐标(x,y)组成,WindowButton 由 Window 组成。在 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->print(); 工作正常。

4

3 回答 3

4

您正在传递一个指向 operator<< 的指针,它需要一个 &。

cout << endl << *test;

你也可以做到:

ostream& operator<<(ostream& out, const WindowButton& ref){

假设 print 实际上并没有修改。

但是,更大的问题是您为什么要使用coutostream 来触发打印theWindow- 这些似乎(尽管不是)逻辑上断开的进程。您可以将给定的流传递到 Window::print:

void Window::print(ostream& stream) {

并使用该流代替cout. 这避免了硬编码coutWindow::print().

于 2012-09-16T21:41:11.617 回答
1

它是一个指针,因此您需要取消引用它才能使操作员工作:

cout << endl << *test;
于 2012-09-16T21:40:50.137 回答
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;
}
于 2012-09-16T21:41:48.983 回答