哇哈哈的程序日常 2024-06-17 16:29 采纳率: 0%
浏览 1

C++学习障碍,核心篇,成员函数做友元

使用VS进行C++测试友元时,使用成员函数做友元,一直显示访问不到,显示私有属性不可以访问,这句直接显示错误cout << b->name << "想要" << b->sexlife << endl;
,资深学者来指点一下,代码

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


class goodF;


//创建类
class Building {
    //friend class goodF;
    friend void goodF::visit();//使用成员函数做为友元
public:
    Building();
    string name;
private:
    string life;
};

//
class goodF {

public:
    goodF();
    void visit();
    Building *b;
};
//
Building::Building() {
    name = "哇哈哈";
    life = "爱喝";
}
//
goodF::goodF() {
    //Building *b;
    b = new Building;

}
//
void goodF::visit() {
    cout << b->name << "想要" << b->sexlife << endl;
}

void test() {
    goodF gg;
    gg.visit();
}
int main() {
    test();

    return 0;
}

  • 写回答

3条回答 默认 最新

  • 专家-皆知 2024-06-17 16:29
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    在你提供的代码中,主要的问题在于goodF::visit()函数尝试访问Building类的私有成员life,但是没有正确地声明为友元。另外,visit函数中的sexlife是一个未定义的变量,你可能是想访问Building类的私有成员life

    为了解决这个问题,你需要在Building类中正确声明goodF::visit为友元函数,并且修正visit函数中的变量引用。以下是修改后的代码:

    #include<iostream>
    using namespace std;
    #include<string>
    
    // 前向声明
    class goodF;
    
    // 创建类
    class Building {
        friend void goodF::visit(Building*); // 正确声明goodF::visit为友元函数
    public:
        Building();
        string name;
    private:
        string life;
    };
    
    // 
    class goodF {
    public:
        goodF();
        void visit(Building*);
        Building *b;
    };
    
    //
    Building::Building() {
        name = "哇哈哈";
        life = "爱喝";
    }
    
    //
    goodF::goodF() {
        b = new Building;
    }
    
    //
    void goodF::visit(Building* building) { // 修改函数签名,使其接受一个Building指针
        cout << building->name << "想要" << building->life << endl; // 修正变量名并使用传入的building指针
    }
    
    void test() {
        goodF gg;
        gg.visit(gg.b); // 调用visit时传递gg.b作为参数
    }
    
    int main() {
        test();
        return 0;
    }
    

    在这个版本中,goodF::visit函数被修改为接受一个Building*类型的参数,这样它就可以访问任何Building对象的私有成员。同时,Building类中的friend声明也相应地进行了修改,以匹配这个新的函数签名。

    此外,在test函数中调用visit时,需要将gg.b作为参数传递给visit函数,以便它能够访问正确的Building对象。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月17日

悬赏问题

  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错
  • ¥15 拓扑学,凸集,紧集。。
  • ¥15 如何扩大AIS数据容量