[英]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();
}
我只想使用类B
的b1
对象打印a
和b
成员的值,因为它可以访问类A
的成员函数,因为类B
具有类A
公共继承。 但是,当我尝试使用b1
打印a
和b
值时,我得到了垃圾值。
有人可以解释为什么会这样,以及如何解决它?
a1
和b1
是内存中完全独立的对象实例。 他们在记忆中有自己的a
和b
成员副本。 他们根本没有任何关系。 无论你对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 A
和class 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.