Hea everyone!
首先,我是一个全新的C ++来自基本的C背景,所以我问这个问题可能有点奇怪。
使用场景是我想通过将地图作为指向该函数的指针来更改不同函数内的地图。因为我正在重用其他人的代码,所以更容易将取消引用分配给变量而不是更改所有引用。这导致了类似的情况:
using namespace std;
typedef map<long, double> tl_t;
void fillmap(tl_t* m_p) {
tl_t m = *m_p;
m.insert(pair<long, double>(4, 3.0));
}
int main(int argc, char** argv) {
tl_t m;
cout << "Size: " << m.size() << "\n";
fillmap(&m);
cout << "Size: " << m.size() << "\n";
return 0;
}
有趣的是,现在两个Size:字符串都返回0并且main函数中的原始映射m似乎没有被更改。然而,这有效:
using namespace std;
typedef map<long, double> tl_t;
void fillmap(tl_t* m) {
(*m).insert(pair<long, double>(4, 3.0));
}
int main(int argc, char** argv) {
tl_t m;
cout << "Size: " << m.size() << "\n";
fillmap(&m);
cout << "Size: " << m.size() << "\n";
return 0;
}
据我所知,这2个案例的工作原理应该与main中的m和fillmap函数引用相同的对象相同。当然,两个m变量位于不同的位置,但应该引用相同的对象。
在我写这篇文章时,可能存在的一个问题是,main中的变量m是地图对象,而fillmap中的变量m是地图对象,但不能因为取消引用m_p指针并指定它到最后一个m实际上并没有对同一个对象进行最后的ma引用,而是实际复制了它。我在这里走在正确的轨道上吗?
是的,我知道在正常使用情况下你应该在类似的情况下使用参数引用,但是这让我感到害怕:P。
希望有人可以启发我!
答案 0 :(得分:4)
在C ++中你必须添加&amp;明确地说变量是引用。
在你的例子中:
tl_t& m = *m_p;
应该有帮助。
如果你只使用“tl_t”,你就会创建一个对象的本地副本,一旦你离开fillmap函数就会被销毁。
示例:
struct X {
int a,b;
}
现在输入:
X和X&amp;您可以使用dot(xobject.a,xobject.b)访问类的字段,但这些类型不同。
答案 1 :(得分:1)
这是因为
tl_t m = *m_p;
m
将通过调用复制构造函数来构造,复制过程是按值进行的。您只需将pair<long, double>(4, 3.0)
插入m,而不是m_p
但是,
(*m).insert(pair<long, double>(4, 3.0))
* m是您通过指针传入的对象,因此,pair<long, double>(4, 3.0)
被插入到* m本身。