我正在尝试使用 ifstream 对象作为类构造函数的参数,以便我可以实例化对象数组。目前,我的标题中有以下内容:
class Animal
{
private:
string name;
int portions;
int rarity;
int habitat;
int climate;
public:
Animal(ifstream &animalInput)
{
getline (animalInput, name, 'n');
animalInput >> portions;
animalInput >> rarity;
animalInput >> habitat;
animalInput >> climate;
animalInput.ignore(numeric_limits<streamsize>::max(), 'n');
}
};
在我的主要.cpp:
const int numberOfAnimals = 12;
ifstream animalInput;
animalInput.open ("animals.txt");
if (animalInput.fail())
{
cout << "Opening file animals.txt failed";
exit(1);
}
Animal animals[numberOfAnimals](animalInput);
我收到错误,不存在从"std::ifstream"到"animals[12]"的合适转换函数。然后我的代码无法编译,因为我没有默认构造函数。是我错误地传递了ifstream,还是我试图做的事情是不可能的?
创建对象数组时,默认构造函数用于初始化对象,除非您在初始化列表中提供了要初始化的对象。
您可以使用:
Animal animals[numberOfAnimals] = {Animal(animalInput), Animal(animalInput), ... 12 times };
但是,考虑到您在构造函数中使用animalInput
的方式,它对您不起作用。您应该创建一个默认构造函数来解决此问题。然后,您可以使用:
Animal animals[numberOfAnimals] = {Animal(animalInput)};
使用此方法时,数组的第一个对象将使用来自 animalInput
的数据构造。所有其他对象将使用默认构造函数构造。
另一种选择是通过从文件中读取数据来创建单个对象,然后使用该对象初始化数组的元素。
Animal prototype(animalInput);
Animal animals[numberOfAnimals] = {prototype, prototype, ... 12 times};