运行此程序时只输出第一对值似乎是正确的,其他值则不然。发生了什么事?
#include <iostream>
#include <vector>
class a
{
public:
class b
{
public:
a* parent;
void test()
{
std::cout<<parent->value<<std::endl;
}
} b1;
unsigned long value;
a()
{
b1.parent = this;
value = 2;
}
void go()
{
value++;
b1.test();
}
};
int main()
{
{
a a1;
a1.go();
std::cout<<a1.value<<std::endl;
}
std::cout<<std::endl;
{
a a1; a1 = a();
a1.go();
std::cout<<a1.value<<std::endl;
}
std::cout<<std::endl;
{
std::vector<a> a1; a1.push_back(a());
a1.at(0).go();
std::cout<<a1.at(0).value<<std::endl;
}
return 0;
}
答案 0 :(得分:2)
您缺少类型“a”的副本ctor和赋值运算符。复制或分配对象时,您无法正确更新其b1.parent。相反,b1.parent值指向与其真实父级不同的“a”对象。
要查看此问题,请在现有代码中使用:
void go() {
value++;
std::cout << (this == b1.parent ? "as expected\n" : "uh-oh\n");
b1.test();
}
要修复它,请修改类a:
a() : b1 (this), value (2) {} // a change from your default ctor
a(a const &x) : b1 (this), value (x.value) {}
a& operator=(a const &x) {
value = x.value;
return *this;
}
修改类b(必须像我上面那样使用ctor初始化器):
b(a *parent) : parent (parent) {}