cin >> setter() как реализовать?

162
23 марта 2019, 05:30

основная задача добавить данные введенные с клавиатуры через сеттер вопрос можно ли реализовать подобное не добавляя переменную. Сейчас это работает так:

int day;
cin >> day;
setDate("day", day);

setDate выглядит так:

void date::setDate(string Variable, int set)
{if (Variable == "День" || Variable == "день" || Variable == "day"){day = set;}}

хотелось бы вот так:

cin >> setter(day)

или что-то похожее без добавления дополнительной переменной

Answer 1

Из вашей формулировки вопроса не ясно, что именно вы пытаетесь сделать. Но мои телепатические способности подсказывают мне, что, возможно, вы пытаетесь реализовать что-то вроде манипуляторов ввода

#include <iostream>
class date
{
public:
  class day_proxy
  {
  public:
    day_proxy(date &d) : day(d.day) {}
    friend std::istream &operator >>(std::istream &str, const day_proxy &p) { return str >> p.day; }
  private:
    int &day;
  };
  class month_proxy
  {
  public:
    month_proxy(date &d) : month(d.month) {}
    friend std::istream &operator >>(std::istream &str, const month_proxy &p) { return str >> p.month; }
  private:
    int &month;
  };
  class year_proxy
  {
  public:
    year_proxy(date &d) : year(d.year) {}
    friend std::istream &operator >>(std::istream &str, const year_proxy &p) { return str >> p.year; }
  private:
    int &year;
  };
  friend std::ostream &operator <<(std::ostream &str, const date &d)
  {
    return str << d.day << ":" << d.month << ":" << d.year;
  }
private:
  int day, month, year;
};
date::day_proxy   day_setter(date &d)   { return d; }
date::month_proxy month_setter(date &d) { return d; }
date::year_proxy  year_setter(date &d)  { return d; }
int main()
{
  date d;
  std::cin >> day_setter(d) >> month_setter(d) >> year_setter(d);
  std::cout << d << std::endl;
}

Как несложно видеть, здесь много повторяющегося кода, который легко свернуть в шаблоны. Но ради наглядности я не стал этого делать.

В данном случае формально можно было и обойтись без этих прокси-классов, а просто возвращать из day_setter ссылку int & на поле d.day. Однако это сделало бы ввод бесконтрольным. А в вышеприведенном варианте контроль правильности ввода может быть реализован внутри соответствущих методов прокси-классов.

Answer 2

Нужно для класса date переопределить оператор >>

class date {
  .........
  friend istream& operator>>(istream& is, date& dt);  
}
istream& operator>>(istream& is, date& dt)
{
  is >> dt.day
  return is;
}
READ ALSO
Отключение и включение скринсейвера

Отключение и включение скринсейвера

Как отключить/включить скринсавер в Win10 ? Стандартные способы опробованные ниже не работают:

146
Невозможно преобразовать const char в char

Невозможно преобразовать const char в char

Программа которая заменяет каждую букву в тексте на букву которая идет после нее в алфавите через n символовПри компиляции выдает ошибку...

154
При вызове метода ничего не происходит.С++

При вызове метода ничего не происходит.С++

При вызове метода about(); на любом обьекте ничего не происходит только завершаеться программаХотя метод fiiling(); работает корректно

188