将 ifstream 作为参数传递给类构造函数



我正在尝试使用 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};

最新更新