鱼C论坛

 找回密码
 立即注册
查看: 979|回复: 4

[已解决]友元 ,在类Building里面已经声明多了,visit1函数是其友元,还是无法访问私有

[复制链接]
发表于 2022-1-17 19:43:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 猪猪虾 于 2022-1-17 19:47 编辑

还是无法访问私有成员
//全局函数做友元

#include <stdio.h>
#include<iostream>
#include<cstring>
#include<cstdio>

using namespace std;

class Building
{
        friend void GoodGay::visit1();
public:
        Building()
        {
                m_sittingRoom = "客厅";
                m_bedRoom = "卧室";
        }

        string m_sittingRoom;

private:
        string m_bedRoom;
};


class GoodGay
{
public:
        Building* building;
        GoodGay()
        {
                building = new Building;  //new什么就返回什么,创建了一个Building指针
        }

        void visit1()  //让这个函数可以访问building的私有成员
        {
                cout << "visit1 is visting :" << building->m_sittingRoom << endl;
                cout << "visit1 is visting :" << building->m_bedRoom << endl;
        }

        void vist2()//让这个函数不可以访问building的私有成员
        {
                cout << "visit2 is visting :" << building->m_sittingRoom << endl;
        }
};


int main()
{
        GoodGay gay;
        gay.visit1();
        gay.vist2();
        return 0;
}
最佳答案
2022-1-19 21:37:10
猪猪虾 发表于 2022-1-19 21:20
你这是在类外面实现成员函数,我是在类内。和声明与否没关系把

你注意你的 第 12 行 代码,系统根本不知道 GoodGay 从哪里来,因为还没有声明,直到第 31 行才出现,不能先吃饭才煮饭啊大哥。

你的问题如同:
#include <iostream>
using namespace std;

int A(int a, int b){
    return B(a, b); // 系统根本不懂 B() 是什么
}

int B(int a, int b){ // 这里才开始声明定义 B()
    return a*b;
}

int main()
{
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-17 20:58:20 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2022-1-17 21:19 编辑

你的思路基本没有问题,但是声明和定义循序有问题,你要确定哪里一个优先声明和定义:(注:这里用提前声明 Forward declaration 方法,不然报错)
#include <iostream>
using namespace std;

class Building; // 注意这里,提前声明 Forward declaration

class GoodGay // 注意这里
{
public:
    void visit1(); // 注意这里,提前声明 Forward declaration
    void vist2();  // 注意这里,提前声明 Forward declaration
    GoodGay();     // 构造函数声明
    ~GoodGay();    // 析构函数声明
    Building* building;
};

class Building // 注意这里
{
    public:
        Building()
        {
            m_sittingRoom = "客厅";
            m_bedRoom = "卧室";
        }
        string m_sittingRoom;
        friend void GoodGay::visit1();
    private:
        string m_bedRoom;
};

GoodGay::GoodGay() // 注意这里,必须在定义 class Building 之后才能定义
{
    building = new Building;
}

GoodGay::~GoodGay()
{
    delete building; // 凡是有 new,必然要有 delete
}

void GoodGay::visit1() // 注意这里,必须在定义 class Building 之后才能定义
{
    cout << "visit1 is visting :" << building->m_sittingRoom << endl;
    cout << "visit1 is visting :" << building->m_bedRoom << endl;
}

void GoodGay::vist2() // 注意这里,必须在定义 class Building 之后才能定义
{
    cout << "visit2 is visting :" << building->m_sittingRoom << endl;
}

int main(){
    GoodGay gay;
    gay.visit1();
    gay.vist2();
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-19 21:20:22 | 显示全部楼层
傻眼貓咪 发表于 2022-1-17 20:58
你的思路基本没有问题,但是声明和定义循序有问题,你要确定哪里一个优先声明和定义:(注:这里用提前声明 ...

你这是在类外面实现成员函数,我是在类内。和声明与否没关系把
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-19 21:31:48 | 显示全部楼层
猪猪虾 发表于 2022-1-19 21:20
你这是在类外面实现成员函数,我是在类内。和声明与否没关系把

大哥,写代码很辛苦,尤其是特长代码,希望你认真看清楚。

我拿其中一个例子,你的 GoodGay() 是 GoodGay 的构造函数,在 GoodGay 里面声明了,但是必须 Building 之后才能定义。
你的代码牵涉很多声明和定义顺序。

如果用你的代码执行,报错已经说明一切!
问题.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-19 21:37:10 | 显示全部楼层    本楼为最佳答案   
猪猪虾 发表于 2022-1-19 21:20
你这是在类外面实现成员函数,我是在类内。和声明与否没关系把

你注意你的 第 12 行 代码,系统根本不知道 GoodGay 从哪里来,因为还没有声明,直到第 31 行才出现,不能先吃饭才煮饭啊大哥。

你的问题如同:
#include <iostream>
using namespace std;

int A(int a, int b){
    return B(a, b); // 系统根本不懂 B() 是什么
}

int B(int a, int b){ // 这里才开始声明定义 B()
    return a*b;
}

int main()
{
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-7-4 00:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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