2016-07-02 6 views
0

私のコードに何か問題があります。それはコンパイルされていますが、結果は私が期待しているものではありません。問題の1つを特定することはできますが、私は完全に間違っているのだろうかと思います。ForループでC++ベクタを反復する

私は、クラスと呼ばれるテスト作成しました:

` 
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; 
} 

私がしたら、私は戻ってそれらを移動します問題を解明したいくつかのフィールドが正しく充填されています(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 
+3

私には2つの質問があります:(1)期待される結果はどれですか? (2)*正確に*は実際の結果ですか? –

+1

"なぜ私のIDが増えていないのですか?" 'test'のコンストラクタで' my_id'に代入するのを忘れたので、 –

+1

'width = width;' - コンパイラは、メンバーがではなくパラメータを参照しているとみなします。 'this-> width = width;'を書いたければ、コンストラクタでinitializer-listを使うのが良いでしょう。 – aschepler

答えて

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. それはistream意志としてファイルに欠落している4つの変数のいずれかがある場合にはfalseを返します

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

    、次のようなループがすべき二回

ファイルをループする必要があり「偽」の状態を入力し、ループはそれ自身で停止する

+1

多くの素晴らしい回答がここにあります。誰もが助けてくれてありがとう!私はデバッグのヒントとして、この答えを選んでしまいました。将来的に私は質問を少なくするでしょう! –

0

あなたは、あなたのテストクラスのコンストラクタでmy_id割り当てされていません。

は、あなたのコンストラクタに次の行を追加します。

my_id = button_id; 
関連する問題