2013-05-02 1 views
0

Я пытаюсь узнать больше о векторах и хранить в нем объекты. Я читаю данные из txt-файла. Я не вижу, какую ошибку я делаю, что она не работает.Object Vector C++

Вот мои основные методы

void Reader::readFoodFile() { 
    string name; 
    int cal, cost; 
    ifstream file; 
    file.open("food.txt"); 
    while (file >> name >> cal >> cost) { 
     Food f(name, cal, cost); 
     foodStorage.push_back(f); 

    } 
} 
void Reader::getStorage() { 
    for (unsigned int i = 0; i < foodStorage.size(); i++) { 
     cout << foodStorage[i].getName(); 
    } 
} 

А вот моя еда конструктор:

Food::Food(string newName, int newCalories, int newCost) { 
    this->name = newName; 
    this->calories = newCalories; 
    this->cost = newCost; 
} 

В моем файле main.cpp я просто создание Ридер объекта (конструктор теперь) и вызовите методы.

int main(int argc, char** argv) { 

     Reader reader; 
     reader.readFoodFile(); 
     reader.getStorage(); 
} 

Я хочу заполнить Вектор объектами, которые берут данные из txt-файла, а затем распечатывают его (пока).

Любые предложения?

изменить; мой .txt расположение файла

apple 4 2 
strawberry 2 3 
carrot 2 2 

Вот мой Food.h и Reader.h

#ifndef FOOD_H 
#define FOOD_H 

#include <string> 
#include <fstream> 
#include <iostream> 

using namespace std; 

class Food { 
public: 
    Food(); 
    Food(string, int, int); 
    Food(const Food& orig); 
    virtual ~Food(); 
    string getName(); 
    int getCalories(); 
    int getCost(); 
    void setCost(int); 
    void setCalories(int); 
    void setName(string); 
    int calories, cost; 
    string name; 
private: 

}; 

#endif /* FOOD_H */` 

and Reader.h 
`#ifndef READER_H 
#define READER_H 
#include <string> 
#include <fstream> 
#include <iostream> 
#include <vector> 
#include "Food.h" 

using namespace std; 

class Reader { 
public: 
    Reader(); 
    Reader(const Reader& orig); 
    virtual ~Reader(); 

    void readFoodFile(); 
    void getStorage(); 
    vector<Food> foodStorage; 

private: 

}; 

#endif /* READER_H */ 
+1

Какое неправильное поведение вы видите? – yiding

+0

Когда я пытаюсь вызвать getStorage(), я не получаю никакого вывода, просто пустую строку. – ChrisA

+0

Что вы используете для отладки в код? – johnathon

ответ

0

Я только что собрал свой код и он отлично работает для меня .... Я г ++ .... вещей, которые нужны исправить ..

  1. избавиться от конструкторов вы имеете в .h файл и не определен в .cpp
  2. дать реализацию getName.

Ниже мой код:

food.h

#ifndef FOOD_H 
#define FOOD_H 

#include <string> 
#include <fstream> 
#include <iostream> 

using namespace std; 

class Food { public: 
    //Food(); 
    Food(string, int, int); 
    //Food(const Food& orig); 
    //virtual ~Food(); 
    string getName(); 
    int getCalories(); 
    int getCost(); 
    void setCost(int); 
    void setCalories(int); 
    void setName(string); 
    int calories, cost; 
    string name; private: 

}; 

#endif 

food.cpp

#include<iostream> 
#include<string> 
#include "food.h" 
using namespace std; 
Food::Food(string newName, int newCalories, int newCost) { 
    this->name = newName; 
    this->calories = newCalories; 
    this->cost = newCost; } string Food::getName() { 
     return name; } 

reader.h

#ifndef READER_H 
#define READER_H 
#include <string> 
#include <fstream> 
#include <iostream> 
#include <vector> 
#include "food.h" 

    using namespace std; 

    class Reader { public: 
     //Reader(); 
     //Reader(const Reader& orig); 
     //virtual ~Reader(); 

     void readFoodFile(); 
     void getStorage(); 
     vector<Food> foodStorage; 

    private: 

    }; 

    #endif 

повторно ader.cpp

#include <iostream> 
#include "reader.h" 

using namespace std; void Reader::readFoodFile() { 
    string name; 
    int cal, cost; 
    ifstream file; 
    file.open("food.txt"); 
    while (file >> name >> cal >> cost) { 
     Food f(name, cal, cost); 
     foodStorage.push_back(f); 

    } } void Reader::getStorage() { 
    for (unsigned int i = 0; i < foodStorage.size(); i++) { 
     cout << foodStorage[i].getName(); 
    } } 

main.cpp

#include<iostream> 
#include<fstream> 
#include "food.h" 
#include "reader.h" 

using namespace std; 

int main(int argc, char** argv) { 
     Reader reader; 
     reader.readFoodFile(); 
     reader.getStorage(); 
} 

Я скомпилированы с использованием - g++ main.cpp reader.cpp food.cpp

и выход я - applestrawberrycarrots

Таким образом, я не уверен, что вам не хватает....надеюсь, что это поможет

Я не добавил std::endl .. Если вы добавите, что у вас есть std::cout, тогда каждый элемент будет на их собственной линии. Кроме того, вы должны close поток после того, как вы закончите с его помощью.

+0

Большое спасибо. Удаление 'Food(); Продукты питания (const Food & orig); virtual ~ Food(); ' Помогло решить эту проблему. Я буду помнить это о будущем! – ChrisA

+0

Рад, что это помогло ... всякий раз, когда вы определяете конструктор в '.h', но dnt даете определение, C++ будет жаловаться на' undefined reference', поскольку он не понимает, как создать экземпляр конструктора (http://stackoverflow.com/questions/5393293/неопределенная ссылка к classclass) – Bill

0

Я предполагаю, что ваш ех работает с другим относительным путем к одному вы ожидаете. Проверьте, что file.good() является истинным после вызова file.open(). Эта проблема распространена, когда программа IDE (например, Visual Studio) запускает exe с другой рабочей папкой, где записывается exe.