2015-06-15 2 views
0

Это может звучать как очень простой вопрос, но я пытаюсь исправить простую ошибку уже более часа, и я не могу понять, что происходит.Почему логическое значение внутри структуры внутри вектора не обновляется?

У меня есть следующая структура декларации в моем файле заголовка:

struct StudentBody 
{ 
    string name; 

    Vec2 position; 

    bool disabled; 

    StudentBody(string name, Vec2 position) : name(name), position(position) {} 
}; 

Эта структура заполняется в вектор типа:

std::vector<StudentBody> students_real; 

Как это:

students_real = 
    { 
     StudentBody("student1",Vec2(DISPLAY_WIDTH - 50, LOWER_MARGIN + 100)), 
     StudentBody("student2",Vec2(DISPLAY_WIDTH - 100, LOWER_MARGIN + 100)), 
     StudentBody("student3",Vec2(DISPLAY_WIDTH - 150, LOWER_MARGIN + 100)), 
     StudentBody("student4",Vec2(DISPLAY_WIDTH - 200, LOWER_MARGIN + 100)) 
    }; 

По умолчанию у всех учеников установлено значение «disabled» равным false.

Тогда у меня есть «обновление» метод, который получает срабатывает с частотой обновления экрана, и в рамках этого метода у меня есть следующий код:

for (auto it = students_real.begin(); it != students_real.end(); it++) 
     { 
      auto student_to_check = *it; 

      CCLOG("student %s disabled -> %i",student_to_check.name.c_str(),student_to_check.disabled); 

      if (student_to_check.name == "student1" || student_to_check.disabled) { 
       continue; 
      } 

      bool disableStudent = true; 

      //... A custom condition here checks if "disabledStudent" should become false or stay as true... 

      if (disableStudent) 
      { 
       CCLOG("Disabling %s",student_to_check.name.c_str()); 

       student_to_check.disabled = true; 

       CCLOG("student %s disabled -> %i",student_to_check.name.c_str(),student_to_check.disabled); 
      } 
     } 

Проблема здесь является то, что «отключен» флаг не оставаясь как истинное. Когда я сначала проверяю условие, оно ложно. Затем я также проверяю свое второе условие и, если оно выполняется, я устанавливаю его в true. Однако при следующем запуске этого цикла цикл условие возвращается к false.

Это заставляет меня поверить, что мой "auto student_to_check = *it;" дает мне копию структуры для обработки, но не сама структура? Или что происходит? Почему я не могу изменить значение структуры внутри вектора?

+0

'авто student_to_check = * = Оно деталь A.'> 'Авто & student_to_check = * – user657267

+0

нужно Оно деталь A.' быть 'Авто & student_to_check = * это,' – sp2danny

+4

Ваш конструктор 'StudentBody' не гарантирует, что«по умолчанию все студенты имеют их «отключено» установлено на false « –

ответ

6

Это:

auto student_to_check = *it; 

объявляет локальную переменную, которая является копией структуры в векторе. Точки итераторов в структуре в векторе, так что вы можете использовать:

auto student_to_check = it; 

и:

student_to_check->disabled = true; 

или более просто следование доступа ничего в структуре вектора. Тогда вам не нужна локальная переменная:

it->disabled = true; 

Еще лучше было бы использовать 11 C++ варьируются на основе для цикла, так как @ sp2danny прокомментировал:

for(auto& student_to_check : students_real) 

student_to_check будет ссылаться на структуру в векторе вместо локальной копии, а остальная часть вашего кода остается как есть.

+0

Я думаю, что понимаю, что вы имеете в виду, на самом деле у меня (для auto student_to_check: students_real) сначала, но у меня было такое же поведение, поэтому я изменил его на использование итераторов. Было ли это потому, что мне не хватало «&». Является ли поведение по умолчанию для авто по структурам делать копию и auto & делать указатель? Для объектов с использованием авто достаточно право? поскольку объекты уже являются указателями. – Pochi

+1

объекты не указатели. C++ использует семантику значений – sp2danny

+0

@Chiquis, да, без '&' 'for' делает копию объекта. Добавление '&' делает 'student_to_check' ссылкой на исходный объект. –

Смежные вопросы