我试图使用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');
}
};
在我的main.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,或者我不想做什么?
答案 0 :(得分:0)
创建对象数组时,默认构造函数用于初始化对象,除非您在初始化列表中提供要初始化的对象。
您可以使用:
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};