函数返回ostream

时间:2011-10-21 20:52:47

标签: c++ function stream

我想知道是否有可能创建函数返回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)  

我不希望getXY()返回任何字符串或char数组。我可以以某种方式返回部分流吗?

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

为什么不为您的班级实施operator <<?它会完全符合您的要求。

答案 2 :(得分:2)

如果您只需要打印一种输出,只需覆盖包含类中的operator<<即可。但是,如果您需要根据不同的上下文打印不同类型的输出,您可以尝试创建不同代理类的对象。

代理对象可以保存对Point的引用,并根据您的需要打印它(或部分内容)。

我会使代理对象Point的私有成员类限制其可见性。

编辑删除样本 - 我没有注意到这是作业。

答案 3 :(得分:1)

除了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函数如果需要访问私有成员,则可以成为friendPoint