访问成员变量的问题

时间:2018-05-30 18:47:49

标签: c++ inheritance initialization

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

我只想使用类a的{​​{1}}对象打印bb1成员的值,因为它可以访问类{的成员函数{1}}因为类B具有类A的公共继承。但是,当我尝试使用B打印Aa的值时,我会收到垃圾值。

有人可以解释为什么会发生这种情况以及如何解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

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 {
    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();
}