矢量消失了

时间:2015-01-23 13:03:09

标签: c++ class c++11 vector

因为我在Item::return_all()中称之为main.cpp,所以我遇到了问题。之前我在return_allread_file()尝试for (auto data : example_item)正确地在item_内循环打印数据。如果我在main中调用它,return_all()item_内没有返回(或至少main.cpp不打印它)数据的原因是什么?或者item_内的数据是否由于某种原因而消失,因为我的c ++知识非常有限。

Items.txt包含“1001:0:6”格式的行。

main.cpp中
#include "item.hh"
#include "functions.hh"

int main() {
   Item item;
   read_file("items.txt");
   std::vector<std::vector<int>> example_item = item.return_all();
   for (auto data : example_item){
       for (auto data2 : data){
           std::cout << data2 << std::endl;
       }
   }
}
item.hh
class Item {

  public:
    Item();
    void add_item(std::vector<int> item);
    std::vector<std::vector<int>> return_all();
    std::vector<int> return_item(const int& name) const;

  private:
    std::vector<std::vector<int>> item_; 
};
item.cpp
#include "item.hh"
#include "functions.hh"

Item::Item(){}

void Item::add_item(std::vector<int> item){
    item_.push_back(item);
}

std::vector<std::vector<int>> Item::return_all(){
    return item_;
}

std::vector<int> Item::return_item(const int& name) const {
    for (auto item : item_) {
        if (item.at(0) == name) {
            return item;
        }
    }
    return {};
}
functions.hh
void read_file(const std::string name);
std::vector<std::string> split(const std::string& string, char splitter);
functions.cpp
#include "item.hh"
#include "functions.hh"

void read_file(const std::string name){
       Item item;
       std::string line;
       std::ifstream myfile(name);
       if (myfile.is_open())
       {
         while (getline(myfile, line))
         {
             std::vector<std::string> field{};
             field = split(line, ':');
             int name = std::stoi(field.at(0));
             int type = std::stoi(field.at(1));
             int attr = std::stoi(field.at(2));
             std::vector<int> field_i = {name , type, attr};
             item.add_item(field_i);
         }
       }
         myfile.close();
   }

std::vector<std::string> split(const std::string& string, char splitter) {
    std::vector<std::string> fields{};
    std::string::size_type start_p{0};
    while ( true ) {
        std::string::size_type end_p{0};
        end_p = string.find(splitter, start_p);
        if ( end_p == std::string::npos ) {
            break;
        }
        std::string field{""};
        field = string.substr(start_p, end_p - start_p);
        fields.push_back(field);
        start_p = end_p + 1;
    }
    fields.push_back(string.substr(start_p));
    return fields;
}

2 个答案:

答案 0 :(得分:1)

改变这个:

Item item;
read_file("items.txt");

为:

Item item = read_file("items.txt");

相应地定义read_file。原样,该函数只是将文件读入本地Item,然后销毁。所以你的item总是空的,因为没有任何内容可以添加任何内容。

答案 1 :(得分:0)

其中一个Item被称为&#34; item&#34;这里:

int main() {
   Item item;
   read_file("items.txt");

又来了另一个:

void read_file(const std::string name){
   Item item;

这两个是不同的对象,您只需修改read_file中的对象。

解决此问题的最简单方法是从read_file返回一个对象:

Item read_file(const std::string name){
   Item item;
   // The rest of the code
   return item;
}

int main() {
   Item item = read_file("items.txt");
   // ...