如何操作重载“>>”?
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>>
可以失败
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>>
可以失败