2016-07-16 3 views
-1

J'espère que quelqu'un peut m'aider. Dans le but d'être plus précis sur ce dont j'ai vraiment besoin, et de réduire mon code, je suis passé d'un vecteur purement de classe à un vecteur d'objets d'une nouvelle classe, dont ma classe d'origine est un type dans.itération à travers un vecteur qui contient une classe personnalisée C++

J'espère que je me suis expliqué clairement jusqu'à ce point. Je vais montrer les classes pertinentes:

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() 
    {}; 

Il y a un peu plus pour eux, mais c'est le pain et le beurre. Maintenant, auparavant, je l'avais utilisé une fonction de membre au sein de « screenarea », pour retourner une valeur que je voulais partir d'un objet spécifique:

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

Et je l'ai modifié une fonction de recherche pour utiliser cette fonction de membre du screenarea qui est type contenu dans "bet".

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

Cependant ... il retourne des ordures. Il me manque clairement quelque chose, mais je le traverse logiquement et tout semble logique.

Désolé d'avance si c'est quelque chose de simple! Et j'apprécie que cela puisse sembler long, mais j'apprécierais vraiment de l'aide!

Et juste pour être super clair ... Voilà comment je l'appelle:

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

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

En réponse à un commentaire très rapide. Il est clair que le problème commence au moins par un morceau de code non publié. Mon vecteur de "bet" n'est pas rempli avec les arguments que je lui passe quand j'essaye de surcharger le constructeur. J'ai supposé que j'avais corrigé la syntaxe correctement lorsque j'ai créé la nouvelle classe "bet", mais après avoir sondé le vecteur, il ne montre aucune donnée.

Dans ma fonction 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; 

} 

Maintenant, la seule partie de ce qui a changé depuis que j'avais cette fonction travaillait est:

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

donc je devine que c'est là le problème Provient. Les variables ne surchargent pas le constructeur par défaut screen_area. Donc quand je:

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

Je vois toujours la valeur que je place dans le constructeur par défaut. C'est "0" dans le constructeur que j'ai posté ici, mais si je le change, il change en conséquence.

Et je n'aurais pas dû dire des ordures, j'étais fautif de penser que j'avais correctement identifié la zone du problème, et d'essayer d'être concis. Donc je suppose que je devrais demander d'abord ... Comment puis-je surcharger correctement ce constructeur "screenarea"?

+1

"It returns garbage" ne fournit pas suffisamment d'informations sur le problème pour que quelqu'un puisse vraiment vous aider. Il y a quelques problèmes avec le code que vous avez montré mais sans [mcve] il est presque impossible de savoir où le problème (quel qu'il soit) pourrait être. Est-ce que vous vérifiez si 'load_map()' fonctionne réellement? Est-ce que le vecteur contient les données que vous pensez faire? Avez-vous franchi le débogueur pour voir de quel point vient la "poubelle"? –

+0

ok merci pour ce commentaire. Je vais mettre à jour la question pour répondre à ce que vous avez souligné! –

Répondre

2

Le problème ici était dans la classe Constructeur de la mise.

Après avoir un coup d'oeil ici: http://www.cplusplus.com/doc/tutorial/classes/

Je réécris le constructeur dans la classe Bet:

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) 
{}; 

Mes excuses si je perdu du temps de tout le monde avec une directive erronée, et merci pour les conseils judicieux de Jonathon Potier.

Je ne sais pas pourquoi je pensais que vous pouviez appeler les constructeurs entre parenthèses. Mon compilateur ne semblait pas s'en plaindre, mais d'après ce que je peux comprendre, je ne faisais que créer un objet temporaire.