gpt4 book ai didi

c++ - 指向对象的指针中的混淆

转载 作者:行者123 更新时间:2023-11-28 02:44:47 24 4
gpt4 key购买 nike

在下面的代码中,我定义了 int 的映射和类 A 的对象。我定义了两个函数,funwithPointer 和 funwithoutPointer。如您所见,我正在尝试增加类对象中的投票并将其添加到映射中。如果我使用对象的指针,那么在第 3 次调用时,我在声明没有指针的对象(funwithoutPointer)时获得 2 票,无论我调用该函数多少次,我都不能将投票增加到 1 以上。有什么问题 ?

#include<iostream>
#include<map>
using namespace std;
class A{
public:
int x;int vote;
A(int a):x(a),vote(0){}
void change(){
cout<<vote<<endl;
vote++;}
};
void funwithPointer(map<int,A>& m){
for(int i=0;i<5;i++){
if(m.find(i)==m.end()){
A* a=new A(10);
a->change();
m.insert(pair<int,A>(i,*a));
}
else{
A* a=&m.find(i)->second;
a->change();
}
}
}
void funwithoutPointer(map<int,A>& m){
for(int i=0;i<5;i++){
if(m.find(i)==m.end()){
A a= A(10);
a.change();
m.insert(pair<int,A>(i,a));
}
else{
A a=m.find(i)->second;
a.change();
}
}
}
int main(){
map<int,A> m;
funwithoutPointer(m);
funwithoutPointer(m);
funwithoutPointer(m);
}

最佳答案

在函数中

void funwithoutPointer(map<int,A>& m){
for(int i=0;i<5;i++){
if(m.find(i)==m.end()){
A a= A(10);
a.change();
m.insert(pair<int,A>(i,a));
}
else{
A a=m.find(i)->second;
a.change();
}
}
}

在声明中

            A a=m.find(i)->second;
a.change();

您创建了一个类型 A 的新对象并增加了它的数据成员。它与 map 中的相应对象没有任何共同之处。按以下方式更改这些语句

            A &a = m.find(i)->second;
a.change();

即使用对 map 中对象的引用。或者你可以用下面的方式代替这两个语句

            m.find(i)->second.change();

正如您在这两个语句之间所看到的

            A &a = m.find(i)->second;
a.change();

和第一个函数中的语句

            A* a=&m.find(i)->second;
a->change();

有很多共同点。您可以使用对对象的引用来更改它,也可以使用指向该对象的指针

关于c++ - 指向对象的指针中的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24787337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com