У меня есть эта форматированная строка в istream.Исходные значения istream с форматированной строкой
(5, -4)
Пусть говорят:
- открывающая скобка
- целое число
- запятой и пространство
- другое целое число
- закрыть круглую скобку
Я хотел бы знать, какой наилучший способ извлечь оба целых числа и проверить форматирование строк.
Это в классе, как это:
class MyPoint
{
public:
MyPoint() = default;
~MyPoint() = default;
...
friend ostream & operator>>(ostream & lhs, MyPoint const & rhs);
...
private:
int x, y;
};
ostream & operator>>(ostream & lhs, MyPoint const & rhs) {
// ???
}
Большое спасибо всем.
Вот мой файл заголовка
#ifndef MYPOINT_H
#define MYPOINT_H
#include <iostream>
using namespace std;
class MyPoint
{
public:
MyPoint() : mX{ 0 }, mY{ 0 } { ; }
MyPoint(int x, int y) : mX{ x }, mY{ y } { ; }
~MyPoint() = default;
int x() const { return mX; }
int y() const { return mY; }
void setX(int x) { mX = x; }
void setY(int y) { mY = y; }
MyPoint operator-() const { return MyPoint(-mX, mY); }
MyPoint operator+(MyPoint rhs) const { rhs.mX += mX; rhs.mY += mY; return rhs; }
MyPoint operator-(MyPoint rhs) const { rhs.mX = mX - rhs.mX; rhs.mY = mY - rhs.mY; return rhs; }
MyPoint operator*(MyPoint rhs) const { rhs.mX *= mX; rhs.mY *= mY; return rhs; }
MyPoint operator/(MyPoint rhs) const { rhs.mX = mX/rhs.mX; rhs.mY = mY/rhs.mY; return rhs; }
MyPoint operator%(MyPoint rhs) const { rhs.mX = mX % rhs.mX; rhs.mY = mY % rhs.mY; return rhs; }
friend MyPoint operator+(int lhs, MyPoint const & rhs);
friend MyPoint operator-(int lhs, MyPoint const & rhs);
friend MyPoint operator*(int lhs, MyPoint const & rhs);
friend MyPoint operator/(int lhs, MyPoint const & rhs);
friend MyPoint operator%(int lhs, MyPoint const & rhs);
friend ostream & operator<<(ostream & lhs, MyPoint const & rhs);
friend istream & operator>>(istream & lhs, MyPoint & rhs);
private:
int mX, mY;
};
#endif //MYPOINT_H
А вот мой исходный файл
#include "MyPoint.h"
MyPoint operator+(int lhs, MyPoint const & rhs) {
return MyPoint(lhs + rhs.mX, lhs + rhs.mY);
}
MyPoint operator-(int lhs, MyPoint const & rhs) {
return MyPoint(lhs - rhs.mX, lhs - rhs.mY);
}
MyPoint operator*(int lhs, MyPoint const & rhs) {
return MyPoint(lhs * rhs.mX, lhs * rhs.mY);
}
MyPoint operator/(int lhs, MyPoint const & rhs) {
return MyPoint(lhs/rhs.mX, lhs/rhs.mY);
}
MyPoint operator%(int lhs, MyPoint const & rhs) {
return MyPoint(lhs % rhs.mX, lhs % rhs.mY);
}
ostream & operator<<(ostream & lhs, MyPoint const & rhs) {
return lhs << "(" << rhs.mX << "," << rhs.mY << ")";
}
istream & operator >> (istream & lhs, MyPoint & rhs) {
return lhs >> "(" >> rhs.mX >> "," >> rhs.mY >> ")"; // HERE is the compiling error
}
И, наконец, испытания в главном
MyPoint p1, p2(2, -2);
cout << p1 << endl;
cout << p2 << endl;
С помощью этого файла, я получил это error: Ошибка C2679 двоичная '>>': оператор не найден, который принимает правый операнд ty «Const символ [2]» ре (или нет приемлемой конверсии)
Привет, Джерри. Это именно то, что я искал. Кроме того, я не могу найти документацию об этом Я имею в виду, какой технический термин использовать, если я хочу найти некоторую информацию о iostream >> (char *) что-то? Большое спасибо за все детали! – Aesope
@Aesope: Я не знаю, что есть много деталей, кроме того, что это просто еще одна перегрузка оператора. Существует существующая перегрузка для чтения строки в (указатель, на который ссылается) указатель. Это просто еще одна перегрузка, основанная на 'const'ness указателя. Перегрузка на константу должна быть покрыта любой достойной книгой на C++; это еще одно применение хорошо известной возможности. –
Привет, Джерри. Это то, что я думал. Между тем у меня возникла странная ошибка при компиляции. Нужен ли мне специальный файл заголовка? или что-то другое? Я получил эту компиляционную ошибку от MSVC++ 2015: ошибка C2679: двоичный '>>': оператор не найден, который принимает правый операнд типа 'const char [2]' (или нет приемлемого преобразования) – Aesope