【发布时间】:2016-04-03 23:27:36
【问题描述】:
我有以下代码
#include <iostream>
#include <vector>
using namespace std;
struct foo {
struct bar {
int foobar;
};
vector<bar*> barp;
bar & insert(int v){
bar * b = new bar();
(*b).foobar = v;
barp.push_back(b);
return *b;
}
void edit(bar & b, int v){
b.foobar = v;
}
};
int main() {
foo f;
foo::bar b = f.insert(5);
f.edit(b, 10);
std::cout << (b.foobar == 10?"true":"false") << std::endl;//now ok
std::cout << (b.foobar == 5?"true":"false") << std::endl;//now ok
std::cout << ((*f.barp[0]).foobar == 10?"true":"false") << std::endl;//after edit, still returns false
std::cout << ((*f.barp[0]).foobar == 5?"true":"false") << std::endl;//after edit, returns true
return 0;
}
谁能解释一下,为什么“b.foobar”没有变成 10? b和f.barp[0]中保存的地址不一样吗?
编辑:感谢您的回答,添加对 void edit(bar & b, int v) 的引用当然是有道理的。然而,添加对“bar & insert”的引用似乎并没有改变任何东西,因为 (*f.barp[0]).foobar 在编辑后保持不变,即使 insert 现在应该返回引用。
【问题讨论】:
-
你认为
return *b会做什么? -
f.barp中保存指针的对象,不是吗?
-
SuhDude555b与其地址存储在barp中的对象不同。想象一下它与任何其他类型:int insert(int v){int *b=new int(); *b = v; barp.push_back(b); return *b;}
标签: c++ pointers c++14 memory-address