Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在cpp中处理对象时出错_C++ - Fatal编程技术网

C++ 在cpp中处理对象时出错

C++ 在cpp中处理对象时出错,c++,C++,我对cpp很陌生。我面临以下代码中的问题。 我希望当我从main一次又一次地调用checkyo()时,id的值应该增加。然而,它仍然是一样的 **如果输入 检查is=1 检查is=1 检查is=1 检查is=1 检查is=1 按任意键继续** 但是,我希望输出是 **如果输入 检查is=1 检查is=2 检查is=3 检查is=4 检查is=5 请指出我的错误? #include<iostream> #include<vector> int count1; using n

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

**如果输入

检查is=1

检查is=1

检查is=1

检查is=1

检查is=1

按任意键继续**

但是,我希望输出是

**如果输入

检查is=1

检查is=2

检查is=3

检查is=4

检查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;
  }
#包括
#包括
int count1;
使用名称空间std;
甲级{
int-id;
公众:
(){
id=0;
}
无效检查()
{
++身份证;

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

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

因为在checkyo()函数中,只需将_向后推一次,然后count1就会更改为2,因此
v
始终有一个元素在check()函数中输出
1

A temp = v.back();
temp.check();
temp始终是
v
中最后一个元素的副本,它不是对v的最后一个元素的引用

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

A &temp = v.back();
temp.check();
因为在checkyo()函数中,只向后推一次,然后count1变为2,所以在check()函数中,
v
总是有一个元素输出
1

A temp = v.back();
temp.check();
temp始终是
v
中最后一个元素的副本,它不是对v的最后一个元素的引用

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

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

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

A temp = v.back();
temp.check();
此临时对象的
id
会递增,但不会递增
向量的
对象中的
id
s

再次调用
checkyo()
时,会出现一个新的临时
a
,其
id
0
。 如果要增加向量中的最后一个对象,则必须使用对此对象的引用

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

现在,最后一个对象不再被复制,它的
id
增加了
1
,每次调用
checkyo()

在调用
check()
之前,您都会创建一个临时对象

A temp = v.back();
temp.check();
此临时对象的
id
会递增,但不会递增
向量的
对象中的
id
s

再次调用
checkyo()
时,会出现一个新的临时
a
,其
id
0
。 如果要增加向量中的最后一个对象,则必须使用对此对象的引用

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

现在,最后一个对象不再被复制,它的
id
增加了
1
,每次调用
checkyo()

我都不明白这一点。:-| v.back()返回向量中最后一个元素的引用。那么,如果临时对象,这个概念会从哪里来呢?@检查从
返回的对象
的计数为零。复制并存储在
temp
中。复制的
.check()
递增为一。复制报告并随后销毁。下一次运行会重新执行,但
.check()
永远不会在向量后面的实际对象上调用。它总是只在该对象的副本上调用。(和+1,顺便说一句)。@请检查更新的答案。@WhozCraig好的!我能说**a temp=v.back()**是完全错误的吗?因为,v.back()返回对对象的引用,我应该将其分配给**a&temp**而不是temp?????
a temp=v.back()返回对向量中最后一个元素的引用。那么如果临时对象的概念从何而来?@检查从
返回的对象。back()
的计数为零。复制并存储在
temp
中。副本的
检查()
增加到1。副本报告,然后被销毁。下一次运行会重新执行,但是
.check()
不会在向量后面的实际对象上调用。它总是只在该对象的副本上调用。(和+1,顺便说一句)。@check请查看更新的答案。@WhozCraig好的!我能说**a temp=v.back()**完全错误。因为,v.back()返回对对象的引用,我应该将该引用分配给**a&temp**而不是temp?????
a temp=v.back()
使副本不是引用。。。。