繁体   English   中英

访问成员变量的问题

[英]Issue in accessing member variables

#include<iostream>

class A {
    int a, b;
public:
    void setdata(int x, int y) { a = x; b = y; }
    void showdata() { std::cout << a << b; }
};

class B : public A { };

int main() {
    A  a1;
    B  b1;
    a1.setdata(5, 4);
    a1.showdata();
    b1.showdata();
}

我只想使用类Bb1对象打印ab成员的值,因为它可以访问类A的成员函数,因为类B具有类A公共继承。 但是,当我尝试使用b1打印ab值时,我得到了垃圾值。

有人可以解释为什么会这样,以及如何解决它?

a1b1是内存中完全独立的对象实例。 他们在记忆中有自己的ab成员副本。 他们根本没有任何关系。 无论你对a1做什么都不会影响b1 ,反之亦然。

您只是初始化a1的成员,而不是初始化b1的成员。 这就是为什么当你试图打印b1的成员时你看到垃圾。

在调用b1.showdata()之前,需要调用b1.setdata()来初始化b1的成员,例如:

int main() {
    A  a1;
    B  b1;
    a1.setdata(5, 4);
    a1.showdata();
    b1.setdata(1, 2); // <-- add this!
    b1.showdata();
}

您还应该为class A一个默认构造函数,该构造函数将成员初始化为默认值,以防在构造后未调用setdata() (例如在您的情况下发生的情况),例如:

class A {
    int a, b;
public:
    A() : a(0), b(0) {} // <-- add this!
    void setdata(int x, int y) { a = x; b = y; }
    void showdata() { std::cout << a << b; }
};

或者,您可以考虑为class Aclass B class A一个将值作为输入的构造函数,例如:

class A {
    int a, b;
public:
    A() : a(0), b(0) {}
    A(int x, int y) : a(x), b(y) {} // <-- add this!
    void setdata(int x, int y) { a = x; b = y; }
    void showdata() { std::cout << a << b; }
};

class B : public A {
public:
    B() : A() {}
    B(int x, int y) : A(x, y) {}
};

/* or simpler:

class B : public A {
public:
    using A::A; // <-- inherit all constructors
};
*/

int main() {
    A  a1(5, 4);
    B  b1(1, 2);
    a1.showdata();
    b1.showdata();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM