gpt4 book ai didi

c++ - 访问成员变量的问题

转载 作者:行者123 更新时间:2023-11-30 02:19:38 25 4
gpt4 key购买 nike

#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 对象打印 ab 成员的值>,因为它可以访问类 A 的成员函数,因为类 B 具有类 A 的公共(public)继承。但是,当我尝试使用 b1 打印 ab 的值时,我得到了垃圾值。

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

最佳答案

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

您只是在初始化a1 的成员,您根本没有在初始化b1 的成员。这就是当您尝试打印出 b1 的成员时看到垃圾的原因。

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

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

关于c++ - 访问成员变量的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50611574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com