如何从派生类访问类的成员 - 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 具有 num1num2 的值,但 r 是一个新实例,其中这些成员尚未初始化。 @wally 请不要在 cmets 中回答;谢谢 只是添加到其他人写的内容:这个问题不是特定于继承。如果您在两个 cpp 文件中都使用了 associate,您会遇到同样的问题 - 您正在创建单独的实例,您对其中一个实例的操作不会影响另一个实例。在深入了解继承之前,您需要更好地理解更基本的 OOP 概念。 这样使用:report* r = (report*)&amp;a; cout &lt;&lt; r-&gt;num1 &lt;&lt; r-&gt;num2 &lt;&lt; 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++的主要内容,如果未能解决你的问题,请参考以下文章

C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???

在 C++ 中将指向基类的指针传递给派生类的成员函数

C++ 派生模板类:访问实例的受保护成员

通过基类指针C++访问派生类的成员

C++多继承

c++继承是如何工作的?