2011-10-21 24 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如果需要访问私人会员。