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

时间:2014-12-24 17:32:54

标签: c++ arrays constructor 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');
}
};

在我的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,或者我不想做什么?

1 个答案:

答案 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};