Функция, возвращающаяся в ostream - PullRequest
2 голосов
/ 22 октября 2011

Интересно, есть ли возможность создать функцию, возвращающую какую-то часть 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);
}

Хотелось бы, чтобы результат был:Я хочу, чтобы getXY () возвращала любую строку или массив символов.Могу ли я как-нибудь вернуть часть потока?

Ответы [ 4 ]

4 голосов
/ 22 октября 2011

Обычно это делается путем перегрузки оператора вставки потока для вашего класса, например:

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;
2 голосов
/ 22 октября 2011

Если вам нужно распечатать только один вид вывода, просто переопределите operator<< в вашем классе. Но если вам нужно напечатать разные виды вывода в соответствии с разными контекстами, вы можете попробовать создать объекты разных прокси-классов.

Прокси-объект может содержать ссылку на Point и печатать ее (или ее части) в соответствии с вашими потребностями.

Я бы сделал прокси-объекты закрытыми классами-членами Point, чтобы ограничить их видимость.

РЕДАКТИРОВАТЬ Удален образец - я не заметил, что это была домашняя работа.

2 голосов
/ 22 октября 2011

Почему бы просто не реализовать operator << для вашего класса?Это будет делать именно то, что вы хотите.

1 голос
/ 14 июля 2015

В дополнение к вашему 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 может быть сделана friend класса Point, если ей нужен доступ к закрытым членам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...