C++ 如何将一个类的私有成员访问到另一个类

C++ 如何将一个类的私有成员访问到另一个类,c++,C++,在下面的代码中,有两个类a和b。我无法解决的错误是,我无法使用类型a的指针ptr访问类b中的名称和时间。我知道还有其他方法可以使用getter或交友功能访问它们,但这是我作业的一部分,所以我被指示以这种方式访问它们。为了方便起见,我对显示错误的行进行了注释。如果有人帮我解决这个问题,那将是一个很大的帮助 class a{ private: char name[12]; char time[12]; public: a(){ strcpy(name,&quo

在下面的代码中,有两个类a和b。我无法解决的错误是,我无法使用类型a的指针ptr访问类b中的名称和时间。我知道还有其他方法可以使用getter或交友功能访问它们,但这是我作业的一部分,所以我被指示以这种方式访问它们。为了方便起见,我对显示错误的行进行了注释。如果有人帮我解决这个问题,那将是一个很大的帮助

class a{
private:
    char name[12];
    char time[12];
public:
    a(){
        strcpy(name,"");
        strcpy(time,"");
    }
    void set(char *n,char *t){
        for(int i=0;n[i]!='\0' && i<12;i++){
            name[i] = n[i];
        
        }
        for(int i=0;n[i]!='\0' && i<12;i++){
            time[i] = t[i];
        
        }
    
    }
    
};


class b{
private:
    a *ptr;
    static int index;
public:
    b(){
        ptr= new a[2];
    }
    b(int size){
        index=size;
        ptr = new a[index];
    
    }
    void show(){
        for(int i=0;i<index;i++){
            cout << ptr[i].name << ", " << ptr[i].time << endl; // Error
            
        }
    }
};
a类{
私人:
字符名[12];
半焦时间[12];
公众:
(){
strcpy(名称“”);
strcpy(时间“”);
}
无效集(char*n,char*t){

对于(int i=0;n[i]!='\0'&&i由于这两个字段都是私有的,所以在这种情况下,如果没有getter或将其公开,则无法访问它们
正如注释所指出的,如果字段受保护,则可以让B继承表单A

只能在其类中或使用getter访问私有成员。
此外,您还可以将这些成员设置为受保护的或公共的,以便成功访问它们。


您可以查看以了解更多信息。

对于无法编辑原始A类的外部类,有两种解决方案:

A)使用指针算法访问私有变量: 创建的动态对象,并将指针移动到私有变量地址的偏移量,然后读取适当的大小

B)实现一个类似于a的类,并在末尾使用getter: 创建一个具有完全相同实现的类(A1),但在末尾添加getter。然后创建a的动态对象并将其强制转换为A1

A a;
A1* a1 = reinterpret_cast<A1*>(&a);
A;
A1*A1=重新解释铸件(&a);

然后,您可以使用getter访问原始的A私有变量。

可能会要求您的讲师进行澄清,因为我不确定为什么既不“编写某种访问器”也不“使
b
A
的朋友
”是可接受的解决方案。有其他方法可以做到这一点,但我首先要仔细检查您对作业约束的理解是否正确。无关:您应该删除动态分配的内存。我的课程讲师向我提供了两个文件:一个头文件和一个cpp文件。类在头文件中定义,而我ts实现(函数的定义)是在cpp文件中。在你发表评论后,我刚刚再次阅读了我的作业说明,我的导师允许修改这些文件,从中我推断我们可以使用getter函数或friend函数。那么,你能指导我如何在访问私人成员时使用friend函数吗。@Nathan Piersonlook,比如你可以使用
strcpy
,因此您可以通过再次使用它在
集中保存大量代码。使
b
a
继承实际上并不能解决这个问题。相关成员是
私有的
,而不是
受保护的
。谢谢我更新了注释(我忘了只有受保护的数据才能访问(y))对于B)由于
a
没有指向
A1
对象,在
a
对象上访问
A1
的方法是未定义的行为,所以我完全搞砸了。现在修复了它。您将代码更改为的并不比原来的好。新代码仍然是未定义的行为,没有真正的
A1
o对象,即从
A
派生
A1
,然后构造
A1
,例如:
class A1:public A{…};A*A=new A1;
如果他不能编辑类
A
,他如何找到正确的偏移量?@DogaOruc这与Nathan Pierson质疑提问者对作业的解释的原因是一样的。当正确的任务执行方式被菲亚特拒绝时,你应该检查原因。可能作业被误读了。May当老师有点鬼鬼祟祟的时候,也许老师不知道如何用C++编程。