构造函数指针更改

mzh*_*ang 0 c++

我有一个文件test.cpp:

#include <stdio.h>
class B {
    public:
            B() {}
};
class A {
    public:
            A(B *b) {
                    b = b;
            }
            B *b;
};
int main() {
    B b = B();
    A a = A(&b);
    printf("b: %p\n", &b);
    printf("a.b: %p\n", a.b);
}
Run Code Online (Sandbox Code Playgroud)

编译下g++ -Wall -std=c++11 test.cpp并运行,给出结果:

b: 0x7fffc7e9fa6f
a.b: 0x7fffc7e9fb60
Run Code Online (Sandbox Code Playgroud)

我假设指针是直接为构造函数复制的,但是我们看到保存在类A实例中的值B已经改变了.

任何帮助将不胜感激!

编辑 - 关于此问题可能偏离主题的讨论:

我不认为这是一个"简单的印刷错误",因为在这种情况下,名称范围错误并不是立即显而易见的.

  • 一个在隔离环境中创建的程序,旨在演示错误.
  • 例如,在Python中,允许使用这种类变量赋值方法.虽然这些命名方案的优点可以留待辩论,但这里一个合理的混淆基础.
  • 我也在寻找解决这个问题的方法(公认的很幼稚),也无法在网上找到解决方案.

编辑编辑 - 很明显,这个问题已得到彻底解答,因此无需进一步回复.然而,如前所述,关闭"偏离主题"的原因值得商榷.

Mik*_*our 7

b = b,两个都b出现了构造函数参数.该成员未被初始化.

解决方案:

  • 使用初始化列表, A(B *b) : b(b) {}
  • 重命名参数,使其不隐藏该成员
  • 将会员称为 this->b

  • @ Cheersandhth.-Alf:为自己说话.如果有人想要我的建议,我会推荐一个初始化列表. (3认同)