在cpp中处理对象时出错

时间:2013-01-24 07:04:57

标签: c++

我对cpp很新。我在以下代码中遇到问题    我希望当我一次又一次地从main调用checkyo()时,id的值应该增加。但它仍然是一样的。

**输入

check is = 1

check is = 1

check is = 1

check is = 1

check is = 1

按任意键继续。 。 **

但是,我希望输出

**输入

check is = 1

check is = 2

check is = 3

check is = 4

check is = 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;
  }

3 个答案:

答案 0 :(得分:2)

因为在checkyo()函数中,你只需要push_back一次,然后count1变为2,所以v总是有一个元素在check()函数中输出1

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

temp始终是v中最后一个元素的副本,它不是对v的最后一个元素的引用。

您可以引用v的最后一个元素,它可以为您提供所需的操作:

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

答案 1 :(得分:2)

在致电check()之前,您需要创建一个临时对象

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

此临时对象的id会增加,但不会增加id个对象中的vector

当您再次致电checkyo()时,会有A id 0的新临时A &last = v.back(); last.check(); 。 如果要增加向量中的最后一个对象,则必须使用对该对象的引用

id

现在,不再复制最后一个对象,每次拨打1时,checkyo()都会{{1}}递增。

答案 2 :(得分:1)

A temp更改为A& temp。您正在复制它,而不是对矢量中的那个进行操作。