如何操作重载“>>”?

How to operate overload ">>"?

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();
    }
}

我收到此行的 "invalid operands to binary expression" 错误:

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

我需要运算符重载 >> 吗?我该怎么做?

在你的Class中,记下这个函数

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

    return in;
}

让我们举一个非常简单的例子,假设 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()或[的return值=17=]。这些用于访问这些值。

相反,您需要读入值并从这些值构建产品,如下所示:

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>> 可以失败