猪猪虾 发表于 2022-1-17 19:43:20

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

本帖最后由 猪猪虾 于 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-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;
}

猪猪虾 发表于 2022-1-19 21:20:22

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

你这是在类外面实现成员函数,我是在类内。和声明与否没关系把

傻眼貓咪 发表于 2022-1-19 21:31:48

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

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

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

如果用你的代码执行,报错已经说明一切!

傻眼貓咪 发表于 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;
}
页: [1]
查看完整版本: 友元 ,在类Building里面已经声明多了,visit1函数是其友元,还是无法访问私有