champ_ 2023-10-14 15:05 采纳率: 92%
浏览 5

关于#c++#的问题:定义了两个类在一个类中声明了另一个类中的成员函数为友元,但是在这个友元成员函数中还是不能调用另一个类中的私有属性

定义了两个类
在一个类中声明了另一个类中的成员函数为友元,
但是在这个友元成员函数中还是不能调用另一个类中的私有属性
代码如下:

class goodGUY
{
public:
    Building* building;
    goodGUY()
    {
        building = new Building;
    }
    void vist1()
    {
        cout << building->keting << endl;
        cout << building->woshi << endl;
    }

};

class Building
{
    friend void goodGUY::vist1();
public:
    string keting;
private:
    string woshi;
public:
    Building()
    {
        keting = "客厅";
        woshi = "卧室";
    }
};

但是当把visit1函数在类外定义时,就可以访问到私有属性,
代码如下:

class goodGUY
{
public:
    Building* building;
    goodGUY()
    {
        building = new Building;
    }
    void vist1();
    

};

class Building
{
    friend void goodGUY::vist1();
public:
    string keting;
private:
    string woshi;
public:
    Building()
    {
        keting = "客厅";
        woshi = "卧室";
    }
};

void goodGUY:: vist1()
{
    cout << building->keting << endl;
    cout << building->woshi << endl;
}

请问具体原因是什么?

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-14 19:34
    关注

    【以下回答由 GPT 生成】

    在类的声明中,编译器会从上到下逐行解析代码,所以在声明goodGUY类时,编译器并不知道Building类的详细定义。因此,它无法确定Building类拥有什么成员变量,包括私有属性woshi

    为了解决这个问题,可以在Building类的前面添加一个前置声明,将其声明为goodGUY类的友元。然后,在Building类的实际定义之前,定义goodGUY类的成员函数。以下是修改后的代码示例:

    class Building;  // 添加前置声明
    
    class goodGUY
    {
    public:
        Building* building;
        goodGUY()
        {
            building = new Building;
        }
    
        void vist1();
    };
    
    class Building
    {
        friend void goodGUY::vist1();
    public:
        string keting;
    private:
        string woshi;
    
    public:
        Building()
        {
            keting = "客厅";
            woshi = "卧室";
        }
    };
    
    void goodGUY::vist1()
    {
        cout << building->keting << endl;
        cout << building->woshi << endl;
    }
    

    请注意,前置声明class Building;不提供完整的Building类定义,而只是告诉编译器在后面会有一个名为Building的类。

    通过这种方法,编译器可以正确解析goodGUY类中的成员函数,并知道Building类的详细定义,从而可以在友元函数vist1()中访问Building类的私有成员属性woshi

    这样修改后,编译器就可以正确解析代码,并且友元成员函数可以访问另一个类中的私有属性。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月14日

悬赏问题

  • ¥15 java代码写在记事本上后在cmd上运行时无报错但又没生成文件
  • ¥15 关于#python#的问题:在跑ldsc数据整理的时候一直抱这种错误,要么--out识别不了参数,要么--merge-alleles识别不了参数(操作系统-linux)
  • ¥15 PPOCRLabel
  • ¥15 混合键合键合机对准标识
  • ¥100 现在不懂的是如何将当前的相机中的照片,作为纹理贴图,映射到扫描出的模型上
  • ¥15 魔霸ROG7 pro,win11.息屏后会显示黑屏,如图,如何解决?(关键词-重新启动)
  • ¥15 有没有人知道这是哪里出了问题啊?要怎么改呀?
  • ¥200 C++表格文件处理-悬赏
  • ¥15 Windows Server2016本地登录失败
  • ¥15 复合卡卡号轨道写入芯片卡