【问题标题】:Ambiguous call to class member's reference对类成员引用的模棱两可的调用
【发布时间】:2016-03-16 07:25:01
【问题描述】:

假设我有一个像这样定义的二叉树节点:(为了方便起见,假设所有成员都是公共的......)

    class node
    {
    public:
       int v;
       node* left;
       node* right;
    //member functions....
    }

我有两个名为 A 和 B 的节点指针并运行以下脚本:

    node* A;
    node* B;
    A->left = B;
    A->left = NULL;

这会使 B 指向 NULL 还是只更改 A 的左子指针(即 this->left in *A)而 B 仍然保持原来的指向?

如果前一种情况为真,我怎样才能改变A->left的值而不影响B?

TIA!

【问题讨论】:

    标签: c++ pointers this


    【解决方案1】:

    不,它没有。 A->left = NULL 只改变A->left 的值。

    注意:我假设 AB 已经以某种方式初始化,因为如果你运行

    node* A; //uninitialized
    node* B; //uninitialized
    A->left = B;
    A->left = NULL;
    

    你会遇到崩溃。

    更新/澄清:很可能,我的意思是。但是即使它可以工作(例如,由于您的非凡(缺乏)运气,您可能会得到一个指向有效内存区域的垃圾值),它也不会做任何好事。如果你得到了一个有效的内存区域,并且写在那里会带来一些理想的结果,立即停止调试,去附近的赌场,你有一个幸运的一天:)

    【讨论】:

    • UB 没必要崩溃:/.
    • @Jarod42,有 99.84% 的概率(该值是经过测量且准确的:))在这种情况下确实如此,所以我决定不深入研究它。 “这是 UB”听起来像是“它可能会起作用,但它很可能会因为某种原因在某个地方坏掉”。在这种情况下(我们取消引用垃圾值作为指针并尝试在那里写一些东西)它会(几乎)到处崩溃。除非 OP 非常(不)幸运,或者他的编译器非常机智。不过,如果您愿意,我现在将编辑答案以使其更具体。
    • 谢谢。是的,我忘记输入初始化 A 和 B 的代码(道歉,因为我更关注问题本身而不是代码。只是为了确保访问 A->left 本质上是访问 (&A+sizeof (int)),对吗?(即 this->left 而不是 B))
    • @SUNSiqi,我明白了:)这就是为什么在最初的答案中我没有太注意它。但既然其他人这样做了,我决定澄清一下。是的,你没看错。唯一错误的是它不是&A+sizeof(int),而是&A+offset_of_left_inside_node_class,一般情况下编译器可能会以不同的方式打包节点类的内容(例如,如果你有一个'char'字段,它可能需要 4 个字节而不是 1)。但总体思路是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 2011-07-23
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多