2011-10-21 59 views
1

我不知道是否有任何可能創建函數返回的ostream的某些部分,如例如:函數返回ostream的

#include <iostream> 

class Point { 
    public: 
    Point(int x, int y){ 
     this->x = x; 
     this->y = y; 
    } 

    ?? getXY(){ // I wish this function returned ostream 
     return ??; 
    } 
    private: 
    int x,y; 
}; 

int main() { 
    Point P(12,7); 
    std::cout << "(x,y) = " << P.getXY(); // (12, 7); 
} 

我想輸出是:

(x,y) = (12,7) 

我不t希望getXY()返回任何字符串或char數組。我可以以某種方式返回流的一部分?

+0

爲什麼不直接返回'std :: string'? – tenfour

+0

這很明顯,我可以這樣做,但它是我大學OOP的「家庭作業」的一部分。我無法編輯行:std :: cout << P.getXY();所以它必須由函數返回。我想知道如果我可以用其他方式做,而不是使用字符串。 – mbes

+0

你不能返回std :: ostream,它有一個私有拷貝構造函數。對於std :: stringbuf也是如此。你可以做的是返回一個帶有兩個值的std :: pair和重載操作符<<以便打印你想要的東西。 – ipapadop

回答

2

爲什麼不爲你的課程實施operator <<?它會做你想要的。

+0

這不是問題所在。我可以重載<<運算符,但最終它總會有相同的結果。例如,我想要在流中使用第二類函數。這就像我想超載<<但只是爲了功能。 – mbes

+0

然後只實現一堆只會實現I/O的朋友類,每個都有自己的'operator <<'。 – littleadv

4

一般來說,這是通過重載流插入運算符類,這樣做:

class Point { 
    public: 
    Point(int x, int y){ 
     this->x = x; 
     this->y = y; 
    } 

    int getX() const {return x;} 
    int getY() const {return y;} 
    private: 
    int x,y; 
}; 

std::ostream& operator<<(std::ostream& out, const Point& p) 
{ 
    out << "(x,y) =" << p.getX() << "," << p.getY(); 
    return out; 
} 

用作:

Point p; 
cout << p; 
+0

你怎麼不歸還ostream? – michaelsnowden

+0

我應該有,這是一個錯誤。編輯。 – Chad

2

如果您只需要打印一個排序的輸出,只是在您的包含類中覆蓋operator<<。但是,如果您需要根據不同的環境打印不同的輸出,您可以嘗試創建不同代理類的對象。

代理對象可以保存對Point的引用,並根據您的需要打印它(或其中的一部分)。

我會讓代理對象的私人成員類Point限制他們的知名度。

編輯刪除樣本 - 我沒有注意到這是作業。

+0

+1,對於給定的約束條件,代理對象方法是最好的方法。 –

0

除了你Point代碼,你可以使用一個輔助功能(以下display())作爲替代超載:

std::ostream& display(std::ostream &os,Point &p) const { 
os<< p.x << p.y ; 
return os; 
} 

int main() { 
    Point p; 
    display(std::cout,p);  
     // This will call the display function and 
     // display the values of x and y on screen. 
} //main 

display功能可以由Point類的friend如果需要訪問私人會員。