在For循环中迭代C ++向量

时间:2016-07-02 00:02:16

标签: c++ vector types

我的代码有问题。它正在编译,但结果不是我所期待的,虽然我可以找出我的一个问题,但我想知道我是否完全走错了路。

我创建了一个名为test的类:

`
class test{

private:

//have moved the variables to public 
//so it's easy to see what's in the vector. 

public:

    int my_id, my_x,my_y,width, height;

test (int button_id=0, int x=0, int y=0, int width=0, int height=0)
{
    my_x = x;
    my_y = y;

    width = width;
    height = height;

}

~test()
{}

void handle_event()
{}

};

`

现在我想用这些对象填充一个向量,并从文本文件中初始化它们。

这是我的方法:

int main(int argc, char const *argv[])
{

    //setup file
    ifstream inputFile("data.dat");
        const char* filename = "data.dat";
              std::ifstream inFile(filename);



    //init Vector
    vector<test> buttons;
        int id, x, y, width,height;
        int max_buttons = count(istreambuf_iterator<char>(inputFile),istreambuf_iterator<char>(), '\n');


    // Make sure the file stream is good
    if(!inFile) {
                cout << endl << "Failed to open file " << filename;
                return 1;
                }


  //Iterate fields into Vector,

  for (id=0 ; id < max_buttons ; id ++) 

  {

    inFile >> x >> y >> width >> height;

    buttons.push_back(test(id,x,y,width,height));    
    cout << std::setw(10) << x << y << width <<height <<endl;

  }

  cout << endl;

for(int p=0; p < 10; p++) // 

  cout << buttons[p].my_id << endl;

    return 0;
}

我已经将类中的变量移动到了public,因此查看它们会更容易,一旦我发现问题,我会将它们移回去。某些字段正确填充(x和y变量),但每次调用时id都不会增加。我有一个完整的向量,但有无意义的数据。我意识到直接从文本文件解析数据意味着它将采用char格式,并且与整数类型不兼容,但为什么我的ID不会增加?

提前致谢!

这是数据:

23 16 10 19
24 40 10 17
23 16 10 16
25 40 10 14
26 16 10 10
27 40 10 12
27 36 10 11
28 40 10 13
29 34 10 18
27 49 10 10

2 个答案:

答案 0 :(得分:0)

您没有在测试类的构造函数中分配my_id。

将此行添加到构造函数中:

my_id = button_id;

答案 1 :(得分:0)

您不是在构造函数中更改对象的id。所以将其更改为以下

test (int button_id=0, int x=0, int y=0, int width=0, int height=0)
{
    my_id = button_id;
    my_x = x;
    my_y = y;

    width = width;
    height = height;

}

尝试使用警告标志进行编译(例如-Werror-Wall-pedantic等等),这样您的代码就会被标记为构造函数中未使用的变量之类的内容在它发生之前你就会知道你的错误!

此外,你不应该通过计算新行的数量来计算文件中的对象数量,这有两个原因是有问题的

  1. 如果某些地方没有新线怎么办?例如,在某些对象之后。
  2. 需要在文件上循环两次
  3. 你应该循环如下,

    while(inFile >> x >> y >> width >> height) { ... }
    

    当文件中缺少4个变量中的任何变量时,这将返回false,因为istream将进入“false”状态并且循环将自行停止