Давайте рассмотрим очень простой пример, предполагая базовое 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>>
может завершиться с ошибкой