0

私はcppにかなり慣れていません。次のコードで問題に直面しています。
main から checkyo() を何度も呼び出すと、id の値が増加するはずです。しかし、それは同じままです。

**場合に入力

チェックは = 1

チェックは = 1

チェックは = 1

チェックは = 1

チェックは = 1

何かキーを押すと続行します 。. .**

ただし、アウトプットは

**場合に入力

チェックは = 1

チェックは= 2

チェックは= 3

チェックは= 4

チェックは= 5

私の間違いを指摘してください?

#include<iostream>
#include<vector>
int count1;
using namespace std;

class A{
  int id;
 public:
 A(){
      id=0;          
  }

  void check()
  {
   ++id;
   cout<<"check is = " << id << endl;

   }   
  };    

 class B{

  vector<A> v;
public: 
    void checkyo()
   {
       if(count1==1)
       {
           cout<< "Entered if \n" ;
           A a;
           v.push_back(a);
       }
    A temp = v.back();
    temp.check();
   }

  };

int main()
 {   
    B b;
    count1 =1;
    b.checkyo();
    count1++;

    b.checkyo();
    b.checkyo();
    b.checkyo();
    b.checkyo();

    system("pause");
    return 0;
  }
4

3 に答える 3

2

checkyo()関数では、push_backを1回だけ実行してから、count1を2に変更するため、check()関数vで出力する要素は常に1つあり1ます。

A temp = v.back();
temp.check();

tempは常にの最後の要素のコピーでありv、vの最後の要素への参照ではありません。

vあなたはあなたが望む操作をあなたに与えるべきである最後の要素への参照を作ることができます:

A &temp = v.back();
temp.check();
于 2013-01-24T07:12:19.870 に答える
2

を呼び出す前にcheck()、一時オブジェクトを作成します

A temp = v.back();
temp.check();

このid一時オブジェクトのはインクリメントidされますが、オブジェクトのsはインクリメントされませんvector

もう一度電話をかけると、のが付いcheckyo()た新しい一時的なものがあります。ベクトルの最後のオブジェクトをインクリメントする場合は、このオブジェクトへの参照を使用する必要がありますAid0

A &last = v.back();
last.check();

これで、最後のオブジェクトはコピーされなくなり、を呼び出すたびにid増分されます。1checkyo()

于 2013-01-24T07:12:44.167 に答える
1

Change A temp to A& temp. You are copying it, rather than operating on the one in the vector.

于 2013-01-24T07:12:09.220 に答える