2016-07-16 5 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() 
    {}; 

Есть немного больше для них, но это хлеб и масло. Теперь ранее я использовал функцию-член в «screenarea», чтобы вернуть любое значение, я хотел от конкретного объекта:

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, которая является тип, содержащийся в «ставке».

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

В ответ на очень скорое комментарий. Понятно, что проблема, по крайней мере, начинается с неопубликованного фрагмента кода. Мой вектор «ставки» не заполняется аргументами, которые я передаю ему, когда я пытаюсь перегрузить конструктор. Я предположил, что правильно исправил синтаксис, когда создал новый класс «ставка», но после проверки вектора он не показывает никаких данных.

В моей функции 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:

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

Мои извинения, если я впустую никого время с дезориентации, и спасибо за разумный совет от Джонатон Поттер.

Я не уверен, почему я думал, что вы можете вызвать конструкторы в круглых скобках. Мой компилятор, похоже, не жаловался на это, но из того, что я могу собрать, я просто создавал временный объект.