VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1724|回复: 8

[已解决]关于 成员函数做友元的一个错误问题求助

[复制链接]
83_avatar_middle
最佳答案
0 
在线会员 发表于 2023-5-26 11:38:48 | 显示全部楼层 |阅读模式
//实体思路:
                //1.分别创建2个类a,b
                //2.类a创建被浏览的属性 以及声明类成员函数 b2为友元
                //3.类b创建 类a的实体 以及浏览函数b1 和浏览函数b2
                //4.全局函数创建类b的实体 并用b的对象调用 类b的浏览函数
  1. #include<iostream>
  2. using namespace std;

  3. class xiaozhang
  4. {
  5.     friend void xiaoming::visit2();
  6. public:
  7.     string SittingRoom;
  8. private:
  9.     string BedRoom;
  10. public:
  11.     xiaozhang() :SittingRoom("客厅"), BedRoom("卧室") {}
  12. };

  13. class xiaoming
  14. {
  15. public:
  16.     void visit1();
  17.     void visit2();
  18.     xiaozhang z;
  19. };

  20. void xiaoming::visit1()
  21. {
  22.     cout << "小明正在参观小张家的:" << z.SittingRoom << endl;
  23. }

  24. void xiaoming::visit2()
  25. {
  26.     cout << "小明又参观了小张家的:" << z.BedRoom << endl;
  27. }

  28. int main()
  29. {
  30.     xiaoming m;
  31.     m.visit1();
  32.     m.visit2();
  33.     return 0;
  34. }
复制代码

这段代码 是我想用 对象的方式 访问类的成员 之前写了一个用指针的方式 没有出现任何错误,我就想着用另外一个方法也写写试试,但是出现了无限循环错误,错误的地方就是 编译器一开始 提示  z.BedRoom没有权限访问 关于 成员函数做友元的一个错误问题求助 但是 我在xiaozhang类中 明明 声明了 friend void xiaoming::visit2(); 是友元 我估计是 编译器阅读顺序问题  但是 当我试着把 xiaoming类 放在 xiaozhang类前面后 编译器又会提示 z 未知标识符 反正是各种错误 好像是成了 循环 依赖的问题了 , 有没有大神 能帮助一下  研究了一晚上到现在了 还没解决  就是想用对象实现下 类成员函数做友元的
最佳答案
59_avatar_small
2023-5-28 15:07:52
这两个类谁放前面都不行,他们是相互依赖的,你可以把xiaozhang这个成员变量去掉当成参数传到xiaoming的成员函数里,这样xiaoming就不依赖xiaozhang,再把xiaoming放上面,xiaoming的成员函数就可以访问xiaozhang的私有变量了




上一篇:win32
下一篇:为什么我的数据库在XP上用不了?什么问题?
83_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2023-5-26 12:10:17 | 显示全部楼层
用对象的写法 去 完成 一个类的成员函数 做 另外一个类的友元 ,我目前遇到的是 各种依赖问题,导致代码无限出错,各种出错,当然 用指针 能轻松解决问题,但是用对象 真的无法实现这种功能么?我掉进了无限依赖循环错误中
17_avatar_middle
最佳答案
41 
在线会员 发表于 2023-5-26 19:40:18 | 显示全部楼层
本帖最后由 yoobaby 于 2023-5-26 19:44 编辑

你这种写法不是成员函数作友元,而是类做友元。  

你加上这句看看你就明白了:
friend class xiaoming;

83_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2023-5-26 20:31:16 | 显示全部楼层
yoobaby 发表于 2023-5-26 19:40
你这种写法不是成员函数作友元,而是类做友元。  

你加上这句看看你就明白了:

大神 说的确实是啊!我添加了类为友元后 啥毛病都没有了 ,我又单独把成员函数友元那句注释掉 还是没毛病,大神能不能细讲下具体为什么我写的不是成员函数做友元么?我单独把类里的成员函数 声明为 友元 为什么一直不行呢?是我的整体写法不对么?还是什么  大神能细讲一下么 ?
59_avatar_middle
最佳答案
4 
在线会员 发表于 2023-5-28 15:07:52 | 显示全部楼层    本楼为最佳答案   
bestAnswer
这两个类谁放前面都不行,他们是相互依赖的,你可以把xiaozhang这个成员变量去掉当成参数传到xiaoming的成员函数里,这样xiaoming就不依赖xiaozhang,再把xiaoming放上面,xiaoming的成员函数就可以访问xiaozhang的私有变量了
83_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2023-5-29 09:17:52 | 显示全部楼层
zylwjj 发表于 2023-5-28 15:07
这两个类谁放前面都不行,他们是相互依赖的,你可以把xiaozhang这个成员变量去掉当成参数传到xiaoming的成员 ...

你这个方法 我那天就试过了 能想到的办法 我都试了 也不行的  后来仔细研究了发现 确实是 没办法 相互依赖的太厉害了 这个思路可能不同了  对于成员函数的好像只能用指针解决 对象行不通 会跳进无限依赖的错误里
83_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2023-5-29 09:21:20 | 显示全部楼层
zylwjj 发表于 2023-5-28 15:07
这两个类谁放前面都不行,他们是相互依赖的,你可以把xiaozhang这个成员变量去掉当成参数传到xiaoming的成员 ...

不过还是谢谢大佬的热心回复 爱你
59_avatar_middle
最佳答案
4 
在线会员 发表于 2023-5-29 09:36:56 | 显示全部楼层
yaho11 发表于 2023-5-29 09:21
不过还是谢谢大佬的热心回复 爱你

这样是可以的,我试过了
#include <iostream>
#include <string>
using namespace std;

class  xiaozhang;

class xiaoming
{
public:
        void visit1(xiaozhang* xz);
        void visit2(xiaozhang* xz);
};

class xiaozhang
{
        friend void xiaoming::visit2(xiaozhang* xz);
public:
        string SittingRoom;
private:
        string BedRoom;
public:
        xiaozhang() :SittingRoom("客厅"), BedRoom("卧室") {}
};



void xiaoming::visit1(xiaozhang* xz)
{
        cout << "小明正在参观小张家的:" << xz->SittingRoom << endl;
}

void xiaoming::visit2(xiaozhang* xz)
{
        cout << "小明又参观了小张家的: " << xz->BedRoom << endl;
}

int main()
{
        xiaoming m;
        xiaozhang* xz = new xiaozhang();
        m.visit1(xz);
        m.visit2(xz);
        return 0;
}
83_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2023-6-7 13:05:40 | 显示全部楼层
zylwjj 发表于 2023-5-29 09:36
这样是可以的,我试过了
#include
#include

谢谢大佬 热心回复 爱你
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-12-10 09:40

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表