2012-09-16 118 views
1

所以在我的程序中我有一些類 - Button,Window和WindowButton。按鈕僅由文本,窗口 - 按鈕和座標(x,y)組成,WindowButton由窗口組成。 在WindowButton,我已經超負荷了< <操作是這樣的:C++ Overloading operator <<輸出地址

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();工作正常。

+0

邊注:在'窗口: :print',在打印之前不需要將文本複製到緩衝區中。只需使用'cout << button-> getText()'。實際上你已經有了內存泄漏 - 每次調用函數時都會分配一個新緩衝區,然後永遠不會釋放它。 –

+0

@JonathanSeng只會說一個問題,但爲什麼你動態地爲它分配一個內存複製按鈕的名字,打印出來然後扔掉。你想要消耗系統的所有內存?使用原始緩衝區進行打印以避免性能和內存使用,或者至少刪除動態分配的內存 – BigBoss

+0

您的char *字符串很糟糕。 – Puppy

回答

4

你是一個指針傳遞給運營商< <一個希望將&。

cout << endl << *test; 

您也可能會使它:

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

它假設打印實際上並沒有改變。

但是,更大的問題是爲什麼您使用cout ostream觸發打印到theWindow - 這些似乎是(雖然不是)邏輯上斷開的進程。您可以在給定的流進入窗口::打印:

void Window::print(ostream& stream) { 

和到位的cout使用流。這避免了將cout硬編碼爲Window::print()

1

這是一個指針,所以你需要取消對它的引用操作員的工作:

cout << endl << *test; 
1

此行

cout << endl << test; 

打印指針WindowButton,並且有一個ostream& operator<<專業化爲指針,打印地址。您可以嘗試取消引用指針:

cout << endl << (*test); 

順便說一句,有在最終只打印到std::cout的方式過載ostream& operator<<小點。這樣一個運營商的觀點是,你可以流到任何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; 
}