如何从派生类访问类的成员 - C++
Posted
技术标签:
【中文标题】如何从派生类访问类的成员 - C++【英文标题】:How to access members of class from derived class - C++ 【发布时间】:2020-04-10 13:24:27 【问题描述】:我有一个名为 associate 和 report 的两个类,分别在 associate.h 文件和 report.h 文件中声明。报表类继承report.h中的关联类如下
associate.h
class associate
public:
int num1, num2;
报告.h
class report : public associate
public:
int add();
我有一个 main.cpp,其中包含了 associate.h 标头并创建了对象和初始化值,如下所示。
associate a;
a.num1 = 10;
a.num2 = 20;
现在我还有一个名为 report.cpp 的 cpp 文件,其中包含 report.h 和 associate.h 并尝试访问 num1 和 num2 值,例如
report r;
cout << r.num1 << num2 << endl;
实际上并没有打印我在 main.cpp 中设置的 10 和 20。在这种情况下,如何从 report.cpp 访问另一个 cpp 文件中的这些值?
【问题讨论】:
a
具有 num1
和 num2
的值,但 r
是一个新实例,其中这些成员尚未初始化。
@wally 请不要在 cmets 中回答;谢谢
只是添加到其他人写的内容:这个问题不是特定于继承。如果您在两个 cpp 文件中都使用了 associate
,您会遇到同样的问题 - 您正在创建单独的实例,您对其中一个实例的操作不会影响另一个实例。在深入了解继承之前,您需要更好地理解更基本的 OOP 概念。
这样使用:report* r = (report*)&a; cout << r->num1 << r->num2 << endl;
@seccpur 不,不要使用裸指针。并且不要将答案放在 cmets 中。
【参考方案1】:
r 和 a 是两个不同的对象,它们占用不同的内存范围。所以改变对象a对对象r没有影响。
如果您希望对象 r 获取对象 a 的数据成员的值,那么您需要将对象 a 分配给对象 r 的关联类型的子对象。
这是一个演示程序。
#include <iostream>
class associate
public:
int num1, num2;
;
class report : public associate
public:
int add();
;
int main()
associate a ;
a.num1 = 10;
a.num2 = 20;
report r ;
r.associate::operator =( a );
std::cout << r.num1 << ' ' << r.num2 << std::endl;
return 0;
它的输出是
10 20
另一种方法是班级报告是一个汇总,然后您可以编写
associate a;
a.num1 = 10;
a.num2 = 20;
report r = a.num1, a.num2 ;
【讨论】:
感谢来自莫斯科的@Vlad,但只有在同一个文件中完成所有操作时,上述操作才有效。那不是我的情况。 @VimalanE 如果一个对象在另一个对象的范围内不可见,那么您确实不能使用另一个对象初始化一个对象。 @VimalanE 你考虑过从文件 a 中包含文件 b 吗?【参考方案2】:你没有。你不能。
您已经创建了两个完全独立且不相关的对象。它们甚至是不同类型的(一个是associate
,另一个是report
;尽管在这种情况下您只对常见的associate
部分感兴趣,所以这很好)。一个对象不包含来自另一个不相关对象的值。
我们看不到您的程序的结构,但在我看来,如果您想在多个地方使用它,您需要传递指向您的 one 对象的指针或引用。具体怎么做取决于你的程序。
【讨论】:
所以我必须将关联对象传递给另一个文件(report.cpp)才能在多个地方使用它? geeksforgeeks.org 和 cppreference.com 每个 .cpp 文件都是一个翻译单元,但它们都链接到一个程序中。无需在文件之间“传递”它们。 @VimalanE 这些不是书(而且,虽然 cppreference.com 很好,但它是已经了解该语言的人的参考)。如果你想成功,你需要从一本书中学习 C++。 Here are some. @wally 您需要在作用域(函数作用域或其他)之间“传递”某些东西,无论是指针、引用还是副本。这些范围在词法上的位置并不重要。以上是关于如何从派生类访问类的成员 - C++的主要内容,如果未能解决你的问题,请参考以下文章