well_hair 2023-10-09 16:12 采纳率: 100%
浏览 5
已结题

c++友元和类对象作为变量不懂,求解答

c++,类对象作为成员变量这里为啥错了呀

#include<iostream>
using namespace std;
#include<string>

class goodgay
{
public:
    void test1();
    building b;                 //这里错了,报错说b未申明标识符
};

void goodgay::test1()
{
    cout << "好朋友正在访问:" << b.m_bedroom << endl;
}

class building
{
    friend void goodgay::test1();
public:
    string m_house = "客厅";
private:
    string m_bedroom = "卧室";
};



int main()
{
    goodgay g;
    g.test1();
    return 0;
}

这个是黑马程序员C++类内函数友元那一节的代码,很奇怪的是如果我把class buiding整个部分放在good gay前面又会报错无法访问buiding的私有变量,明明已经声明友元了呀555,有没有友友看一下,非常感谢

  • 写回答

3条回答 默认 最新

  • Leodong. 2023-10-09 17:14
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    在C++中,如果一个类需要访问另一个类的私有成员,可以通过友元(friend)关键字来实现。友元关键字允许一个类或函数访问另一个类的私有成员。

    在您的代码中,报错说building b未声明标识符是因为在goodgay类中引用了building类的对象 b,但编译器在此之前并不知道building类的存在,因此会报错。

    解决这个问题的方法是在使用building类之前进行前向声明。将goodgay类的声明放在building类之前,然后在goodgay类中声明building类的前向引用,如下所示:

    #include<iostream>
    #include<string>
    using namespace std;
    
    class building; // 前向引用
    
    class goodgay
    {
    public:
        void test1();
        building* b; // 使用指针进行声明
    };
    
    class building
    {
        friend void goodgay::test1();
    public:
        string m_house = "客厅";
    private:
        string m_bedroom = "卧室";
    };
    
    void goodgay::test1()
    {
        cout << "好朋友正在访问:" << b->m_bedroom << endl;
    }
    
    int main()
    {
        goodgay g;
        g.b = new building(); // 创建building对象
        g.test1();
    
        delete g.b; // 释放building对象的内存
        return 0;
    }
    

    在上述代码中,我们使用了指针来声明building对象,因为在前向引用的情况下,编译器无法确定对象的大小。

    main函数中,我们通过new关键字动态分配了一个building对象,并将其赋值给goodgay类中的b成员变量。然后调用test1函数来访问building类的私有成员。

    请注意,在使用完building对象后,需要使用delete关键字释放对象的内存,以避免内存泄漏。

    希望这个解答对您有帮助!如有任何疑问,请随时提问。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月18日
  • 已采纳回答 10月10日
  • 创建了问题 10月9日

悬赏问题

  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥20 java在应用程序里获取不到扬声器设备