2016-07-16 10 views
-1

誰かが私を助けてくれることを願っています。私が本当に必要とするものをより具体的にし、コードを整えるために、私はクラスを純粋に持つベクトルから、元のクラスが新しいクラスのオブジェクトのベクトルを持つように変更しました内にカスタムクラスを含むベクトルを反復するC++

私はこの時点まで自分自身を明確に説明してくれることを願っています。

class screen_area 

{ 

private: 

int my_id, my_x, my_y, my_width, my_height; 
bool active=true; 

public: 

screen_area (int button_id=0, int x=0, int y=0, int width=0, int height=0, bool isactive=true) 
{ 

    my_id = button_id; 
    my_x = x; 
    my_y = y; 

    my_width = width; 
    my_height = height; 
    active = isactive; 

} 


~screen_area() 
{} 



class bet 
{ 

private: 

    int wager = 0; 
    int multiplier = 0; 

public: 

    screen_area area; 

    bet(int wager, int multiplier, screen_area area) 
    {}; 

    ~bet() 
    {}; 

が彼らにもう少しありますが、これはパンとバターです:私は、関連するクラスが表示されます。

int getvalue(int value) 
    { 
    switch(value) 
     { 
      case 1 : 
       return my_id; 
      case 2 : 
       return my_x; 
      case 3 : 
       return my_y; 
      case 4 : 
       return my_width; 
      case 5 : 
       return my_height; 
      case 6 : 
       return active; 
     } 
    } 

そして、私はあるscreenareaにこのメンバ関数を使用するために検索機能を変更しました:今、以前に私は、特定のオブジェクトから望んでいた任意の値を返すために、「screenarea」内のメンバ関数を使用していました"ベット"内に含まれるタイプ。

int returnbuttonid(int mousex, int mousey, std::vector<bet> *buttons) 
{ 

    for (auto ep : *buttons) 
    { 
     if ((ep.area.getvalue(2) > mousex) && (ep.area.getvalue(3) > mousey)) 
      {int id_value = ep.area.getvalue(1); 
      return id_value; 
      } 
    } 
} 

しかし...ゴミを返す。私は明らかに何かを見逃しているが、論理的にそれを検討している。それはすべて意味があるようだ。

申し訳ありません、何か簡単なのですが!そして、これは長く巻き込まれているように見えるかもしれないが、私は本当にいくつかの助けに感謝します!

vector<bet> localbuttons;  //Declaration of Vector 
    load_map("data.dat", &localbuttons); //load buttonmap using function 

    int buttonpressed = returnbuttonid(100,300, &localbuttons); 

非常に迅速なコメントへの返信

そして、ちょうどスーパー明確にする...これは、私はそれを呼び出しています方法です。この問題は、少なくとも未公開のコードから始まることは明らかです。 "ベット"の私のベクトルは、私がコンストラクタをオーバーロードしようとするときに渡している引数で満たされていません。私は新しいクラス "bet"を作成したときに構文を正しく修正したと推測しましたが、ベクトルをプロービングした後にはデータが表示されません。私の関数LOAD_MAPで

bool load_map(std::string path, std::vector<bet> *buttons) 
{ 

    //setup file 
    ifstream inputFile(path.c_str()); 
// 
//The stuff in the middle here is irrelevant 
//and I've take it out to make this tidier 

     buttons->push_back(bet(0,0, screen_area(id,x,y,width,height, true))); 

     } 

return 0; 

} 

今、私はこの機能が働いていた持っていたので、変更されたこのの一部だけです。だから私は、どこに問題これは

buttons->push_back(bet(0,0, screen_area(id,x,y,width,height, true))); 

推測しています起源。変数は、デフォルトのscreen_areaコンストラクタをオーバーロードしていません。だから私は:

cout << localbuttons[1].area.my_id << endl; 

私はいつもデフォルトのコンストラクタに配置値を参照してください。私がここに投稿したコンストラクタでは "0"ですが、私がそれを変更するとそれに応じて変わります。

私はゴミを言ってはいけませんでした。私は問題の領域を正しく特定し、簡潔にしようとしていると思っていたのです。だから私は最初に尋ねるべきだと思います...どうすればこの "screenarea"コンストラクタを正しくオーバーロードできますか?

+1

"ゴミを返す"は、誰かが本当に助けてくれる問題についての十分な情報を提供しません。表示されたコードにはいくつかの問題がありますが、[mcve]がなければ、どこに問題があるのか​​を知ることはほとんど不可能です。 'load_map()'が実際に動作しているかどうかチェックしていますか?ベクターにはあなたが思うデータが含まれていますか?デバッガで "ガベージ"がどこから来ているかを確認しましたか? –

+0

このフィードバックに感謝します。あなたが指摘したことに答えて質問を更新します! –

答えて

2

ここでの問題は、Betクラスのコンストラクタにありました。

ここを見てた後: http://www.cplusplus.com/doc/tutorial/classes/

を私はベットクラスのコンストラクタを書き直し:

bet(int w, int m, int button_id=0, int x=0, int y=0, 
    int width=0, int height=0, bool isactive=true) 

     : area(button_id, x, y, width, height, isactive), 

     wager(w), multiplier(m) 
{}; 

私の謝罪、私はミスディレクション、そしてジョナサンからの賢明な助言に感謝して誰も時間を無駄にしている場合ポッター。

括弧内にコンストラクタを呼び出すことができたとは思っていません。私のコンパイラは、それについて不平を言っているようではなく、私が集めることができるものから、私は一時的なオブジェクトを作成していました。

関連する問題