Как работает перегрузка ">>"? - PullRequest
2 голосов
/ 07 апреля 2020
Product **products;

int numProducts = 0;

void setup()
{
    ifstream finput("products.txt");
    //get # of products first.
    finput >> numProducts;
    products = new Product* [numProducts];

    //get product codes, names & prices.
    for(int i=0; i<numProducts; i++) {
        products[i] = new Product;
        finput >> products[i]->getCode() >> products[i]->getName() >> products[i]->getPrice();
    }
}

Я получаю сообщение об ошибке «недопустимые операнды в двоичном выражении» для этой строки:

finput >> products[i]->getCode() >> products[i]->getName() >> products[i]->getPrice();

Нужно ли перегрузить оператор >> и как мне это сделать?

Ответы [ 2 ]

3 голосов
/ 07 апреля 2020

Давайте рассмотрим очень простой пример, предполагая базовое c определение для Product как:

class Product
{
   int code;
   string name;
   double price;

public:
   Product(int code, const std::string& name, double price)
      : code{code}, name{name}, price{price}
   {}

   int getCode() const { return code; }
   const std::string& getName() const { return name; }
   double getPrice() const { return price; }
};

Вы не можете читать , используя operator>> непосредственно в возвращаемые значения от getCode(), getName() или getPrice(). Они предназначены для доступа к этим значениям.

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

for(int x = 0; x < numProducts; ++x)
{
   int code = 0;
   string name;
   double price = 0;

   finput >> code >> name >> price;
   products[i] = new Product{code,name,price};
}

Теперь вы можете рефакторинг это в operator>>:

std::istream& operator>>(std::istream& in, Product& p)
{
   int code = 0;
   string name;
   double price = 0;

   in >> code >> name >> price;
   p = Product{code,name,price};
   return in;
}

Есть множество других вещей, которые следует учитывать в этом коде:

  • Используйте std::vector<Product> вместо вашего собственного массива
  • Приведенные ниже примеры не будут работать, если name имеет пробелы
  • Проверка ошибок отсутствует и operator>> может завершиться с ошибкой
2 голосов
/ 07 апреля 2020

В своем классе запишите эту функцию

friend ifstream& operator >> (ifstream& in, Product& p1)
{
    in >> p1.code >> p1.name /* ..etc */;

    return in;
}
...