2017-02-20 9 views
0

Я просто пытаюсь запустить эту простую строку кода:Приращение значение структуры в цикле возвращает то же значение каждый раз, когда

for (Client c : clients) { 
    c.timeSinceLastPacket++; 
    std::cout << c.timeSinceLastPacket << std::endl; 
} 

К сожалению, это всегда возвращает 1 после приращения. Если я ставлю печать перед приращением возвращает 0.

Вот моя структура:

struct Client { 
    int timeSinceLastPacket = 0; 
    sf::IpAddress ip; 
    unsigned short port = 0; 
    unsigned short id = 0; 
}; 

Я использую SFML.

Вот что я пробовал:

  • Изменено ++ до + = 1
  • Удалены каждый экземпляр, в котором значение данного пакета определяется как 0 (это можно увидеть в коде у меня есть связанные)
  • Изменено значение пакета плавать
  • Я должен также упомянуть, что мое первоначальное намерение было использовать НФ :: Время, но это не сработало
  • Если я заменю с с клиентами [0] он отлично работает

Код не слишком длинный, но я не хочу ставить его в вопрос. Я связать вас с ней здесь:

Server.h

Server.cpp

+2

_ «Код не слишком длинный, но я не хочу ставить его в вопрос. Я свяжу вас с этим здесь: «Вместо этого создайте [MCVE]. –

+0

код на внешних сайтах и ​​ваш вопрос находится в опасности быть закрытым –

ответ

10
for (Client c : clients) { 

Здесь вы копируете, названный c. Ваш оригинал в clients не затронут.

Если вы хотите, чтобы мутировать оригинальные элементы, используйте ссылку:

for (Client& c : clients) { 
+0

Вы избили меня на 10 секунд! –

+0

@DavidLively: 29 на самом деле;) –

+0

Какой фактор 3x между друзьями?:) –

4

Введя переменный цикл, как Client, вы делаете копию элемента в массиве на каждой итерации. Изменения в цикле обновляют копию, а не исходный элемент, хранящийся в clients.

Сделать ссылку вместо:

for (Client& c : clients) { 

В отличие от Java или C#, C++ по умолчанию типы значений, а не ссылки, поэтому вы должны явно указать, что вы хотите ссылку (или указатель, но синтаксис немного грязнее).

Использование не ссылочного типа здесь также может привести к некоторым проблемам с перфорацией, если тип является сложным или выполняет значительную обработку его конструктора копий. (Это не проблема для типа, который вы здесь изложили, но может быть проблемой в других случаях.)