2017-02-20 7 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]リンク)

  • は、私はまた私の本来の意図は、SFを使用していたことを言及する必要があります::時間
  • をフロートするパケットの値を変更しましたが、私はクライアントとCを交換した場合それは
  • いずれも動作しませんでしたそれはうまく動作します

コードは長すぎるわけではありませんが、私は質問に入れたくありません。私はここでそれをあなたにリンクされます:ここで

Server.h

Server.cpp

+2

_ "コードは長すぎませんが、質問に入れたくありません。私はここにリンクします: "_それをする代わりに、[MCVE]を作ってください。 –

+0

外部サイトにコードを載せていて、あなたの質問は閉鎖される危険性があります –

答えて

10
for (Client c : clients) { 

あなたはcという名前のコピーを作ります。 clientsのオリジナルは影響を受けません。

あなたは、元の要素を変異させたい場合は、参照を使用します。Clientとしてループ変数を入力して

for (Client& c : clients) { 
+0

あなたは10秒で私を倒しました! –

+0

@DavidLively:29実際に;) –

+0

友人の間で3倍の要因は何ですか?:) –

4

を、あなたはすべての反復で配列の要素のコピーを作っています。ループ内の変更は、clientsに格納されている元のアイテムではなく、コピーを更新します。 、JavaやC#とは異なり

for (Client& c : clients) { 

値の型ではなく、参照するC++のデフォルトなので、明示的にあなたが参照(またはポインタをしたいと述べている必要がありますが、構文は次のとおりです。

ではなく、それを参照してください少し厄介)。

ここで非参照型を使用すると、型が複雑であるか、またはそのコピーコンストラクタを重要な処理を実行する場合にいくつかの問題が発生する可能性があります。 (これはあなたがここで概説したタイプの問題ではありませんが、他のケースでは問題になる可能性があります)

関連する問題