当地班级c-ism

时间:2011-02-03 21:38:50

标签: c++

运行此程序时只输出第一对值似乎是正确的,其他值则不然。发生了什么事?

#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;
}

1 个答案:

答案 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) {}