2014-12-24 2 views
0

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); 

내가 오류를 얻고 그 "표준 : : ifstream"에서 "동물에서 더 적합한 변환 기능 없음 [12] "존재합니다. 기본 생성자가 없기 때문에 내 코드가 컴파일되지 않습니다. 내가 ifstream을 잘못 전달했거나 불가능하게하려고 시도한 것이 무엇입니까?

+0

'main.cpp'에서와 같은 방식으로 객체 배열을 초기화 할 수 없습니다. – Pradhan

답변

0

개체 배열을 만들 때 초기화 목록에서 초기화 할 개체를 제공하지 않으면 기본 생성자가 개체를 초기화하는 데 사용됩니다.

당신은 사용할 수 있습니다

생성자에 animalInput를 사용하는 방법 그러나, 주어진
Animal animals[numberOfAnimals] = {Animal(animalInput), Animal(animalInput), ... 12 times }; 

, 당신을 위해 작동하지 않습니다. 문제를 해결하려면 기본 생성자를 만들어야합니다. 그런 다음 사용할 수 있습니다

Animal animals[numberOfAnimals] = {Animal(animalInput)}; 

이 사용하는 경우, 배열의 첫 번째 목적은 animalInput의 데이터로 구성됩니다. 다른 모든 객체는 기본 생성자를 사용하여 생성됩니다.

다른 옵션은 파일에서 데이터를 읽고 단일 개체를 만든 다음 해당 개체를 사용하여 배열의 요소를 초기화하는 것입니다.

Animal prototype(animalInput); 
Animal animals[numberOfAnimals] = {prototype, prototype, ... 12 times}; 
+0

도움을 주셔서 감사합니다. 그래서 내가 알기로는 실제로 생성자를 사용하여 파일의 객체 값 배열의 모든 요소를 ​​신속하게 할당 할 수있는 방법이 없습니다. – jacisback

+0

@ jacisback, 내 업데이트 참조. –

+0

아 그 옵션이 유용 보입니다. 어쨌든 객체 배열의 각 요소가 파일에서 더 읽음으로써 존재하는 다른 값을 가지기를 원한다면? 예를 들어 올바른 것처럼 여러 단일 객체 프로토 타입이 필요합니까? – jacisback

관련 문제