AllBull 2022-01-14 14:28 采纳率: 40%
浏览 22
已结题

c++友元-类中成员函数做友元的问题

问题:

以下是vs2022的报错:
已启动生成…
1>- 已启动生成: 项目: c_cplus, 配置: Debug x64 -
1>11友元.cpp
1>E:\workspaces\11友元.cpp(17,14):** error C2653: “GoodGay3”: 不是类或命名空间名称**
1>E:\workspaces\11友元.cpp(78,41): error C2248: “Building1::BedRoom”: 无法访问 private 成员(在“Building1”类中声明)
1>E:\workspaces\11友元.cpp(27):** message : 参见“Building1::BedRoom”的声明
1>E:\workspaces\11友元.cpp(9): message : 参见“Building1”的声明
1>已完成生成项目“c_cplus.vcxproj”的操作 - 失败。

= 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 =

以下是完整代码


#include <iostream>
#include <string>
using namespace std;
/*
 * 友元无传递性,对称性
 */


class Building1 {
    //1.友元函数
    friend void goodGay1(Building1* building1);

    //2.友元类
    friend class GoodGay2;

    //3.类成员友元函数
    friend void GoodGay3::visit_friend();
public:
    Building1() {
        this->BedRoom = "卧室";
        this->SittingRoom = "客厅";
    }

public:
    string SittingRoom;
private:
    string BedRoom;
};

//1.全局友元函数
void goodGay1(Building1 * building1) {
    cout << "1access :" << building1->SittingRoom << endl;
    cout << "1access :" << building1->BedRoom << endl;    //friend
};

//2.友元类
class GoodGay2{
public:
    //类外实现
    GoodGay2();
    //类内实现
    void visit() {
        cout << "2access:" << this->building2->SittingRoom << endl;
        //2.friend
        cout << "2access:" << this->building2->BedRoom << endl;
    }

    Building1* building2;
};
//类外实现
GoodGay2::GoodGay2() {
    this->building2 = new Building1();
}


//3.类中成员函数 友元类
class GoodGay3 {
public:
    //类内实现
    GoodGay3() {
        this->building3 = new Building1();
    }
    //类内实现
    void visit() {
        cout << "3.1access:" << this->building3->SittingRoom << endl;
        //not friend
        //cout << "2access:" << this->building2->BedRoom << endl;
    }
    //类外实现
    void visit_friend();

    Building1* building3;
};
//类外实现
void GoodGay3::visit_friend() {
    cout << "3.1.1access:" << this->building3->SittingRoom << endl;
    //friend
    cout << "3.2access:" << this->building3->BedRoom << endl;
}


void test111() {
    Building1* building1 = new Building1();
    goodGay1(building1);
    GoodGay2* goodGay2 = new GoodGay2();
    goodGay2->visit();
    GoodGay3* goodGay3 = new GoodGay3();
    goodGay3->visit();
    goodGay3->visit_friend();

}

int main() {
    test111();
    return 0;
}
  • 写回答

1条回答 默认 最新

  • AllBull 2022-01-14 14:49
    关注

    调换了代码顺序后,问题已经解决。
    但是对调换代码顺序就可成功的本质,还没有理解,求助 此代码调换顺序的本质原因

    
    #include <iostream>
    #include <string>
    using namespace std;
    /*
     * 友元无传递性,对称性
     */
    
    class Building1;
    
     //3.类中成员函数 友元类
    class GoodGay3 {
    public:
        //类外实现
        GoodGay3();
    
        Building1* building3;
    
        // 貌似只能在 类实现
        void visit();
        //类外实现
        void visit_friend();
    
        
    };
    
    class Building1 {
        //1.友元函数
        friend void goodGay1(Building1* building1);
    
        //2.友元类
        friend class GoodGay2;
    
        //3.类成员友元函数
        friend void GoodGay3::visit_friend();
    public:
        Building1() {
            this->BedRoom = "卧室";
            this->SittingRoom = "客厅";
        }
    
    public:
        string SittingRoom;
    private:
        string BedRoom;
    };
    
    //1.全局友元函数
    void goodGay1(Building1 * building1) {
        cout << "1access :" << building1->SittingRoom << endl;
        cout << "1access :" << building1->BedRoom << endl;    //friend
    };
    
    //2.友元类
    class GoodGay2{
    public:
        //类外实现
        GoodGay2();
        //类内实现
        void visit() {
            cout << "2access:" << this->building2->SittingRoom << endl;
            //2.friend
            cout << "2access:" << this->building2->BedRoom << endl;
        }
    
        Building1* building2;
    };
    //类外实现
    GoodGay2::GoodGay2() {
        this->building2 = new Building1();
    }
    
    
    
    //类外实现
    GoodGay3::GoodGay3() {
        this->building3 = new Building1();
    }
    void GoodGay3::visit_friend() {
        cout << "3.1.1access:" << this->building3->SittingRoom << endl;
        //friend
        cout << "3.2access:" << this->building3->BedRoom << endl;
    }
    void GoodGay3::visit() {
        cout << "3.1access:" << this->building3->SittingRoom << endl;
        //not friend
        //cout << "2access:" << this->building2->BedRoom << endl;
    }
    
    
    void test111() {
        Building1* building1 = new Building1();
        goodGay1(building1);
        GoodGay2* goodGay2 = new GoodGay2();
        goodGay2->visit();
        GoodGay3* goodGay3 = new GoodGay3();
        goodGay3->visit();
        goodGay3->visit_friend();
    
    }
    
    int main() {
        test111();
        return 0;
    }
    
    评论

报告相同问题?

问题事件

  • 系统已结题 1月22日
  • 创建了问题 1月14日

悬赏问题

  • ¥15 django5安装失败
  • ¥15 Java与Hbase相关问题
  • ¥15 ANSYS分析简单钎焊问题
  • ¥20 bash代码推送不上去 git fetch origin master #失败了
  • ¥15 LOL外服加入了反作弊系统,现在游戏录像rofl文件离线都无法打开
  • ¥15 在centos7安装conda
  • ¥15 c#调用yolo3 dll文件获取的数据对不上
  • ¥20 WPF 如何实现多语言,label 和cs(live Charts)中是否都能翻译
  • ¥15 STM32F103上电短路问题
  • ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB