鱼C论坛

 找回密码
 立即注册
查看: 910|回复: 3

[已解决]为什么加了friend还是无法访问私有成员

[复制链接]
发表于 2020-11-10 22:13:17 | 显示全部楼层 |阅读模式

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

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

x
#include <iostream>
using namespace std;

class Building{
        friend void Goodgay::visit2();    //这里声明了友元
public:
        string m_SettingRoom = "客厅";
private:
        string m_BedRoom = "卧室" ;
};

class Goodgay{
public:
        Goodgay(); 
        void visit1(); 
        void visit2();                  //visit2可以访问building私有成员 
        Building *build;
};
Goodgay::Goodgay(){
        build = new Building;
        
}
void Goodgay::visit1(){
        cout<<"正在访问Building中的:"<<build->m_SettingRoom<<endl;
}
void Goodgay::visit2(){
        cout<<"正在访问Building中的:"<<build->m_BedRoom<<endl;
}
void test01(){
        Goodgay g;
        g.visit1();
        g.visit2();
        
        
}
int main(){
        test01();
        
        system("pause");
        return 0;
}
最佳答案
2020-11-12 09:57:18
本帖最后由 xieglt 于 2020-11-12 10:00 编辑
#include <iostream.h>
#include <string>
#include <stdlib.h>

using namespace std;

class Goodgay;
class Building;

class Goodgay{
public:
        Goodgay(); 
        ~Goodgay();
        void visit1(); 
        void visit2();                  //visit2可以访问building私有成员 
        Building * build;
};

class Building
{
        friend void Goodgay::visit2();    //这里声明了友元
public:
       //可以这样赋值
        Building()
        {
                m_SettingRoom = "客厅";
                m_BedRoom = "卧室";
        }
public:
        string m_SettingRoom; // = "客厅";不能这么赋值
private:
        string m_BedRoom; // = "卧室" ;不能这么赋值
};


Goodgay::Goodgay()
{
        build = new Building;
        
}

//注意释放内存
~Goodgay::Goodgay()
{
        delete build;
}

void Goodgay::visit1()
{
        //cout 不能输出 string 对象,要输出只能输出 string.c_str()
        cout << "正在访问Building中的:" << build->m_SettingRoom.c_str() << endl;
}

void Goodgay::visit2()
{
        //cout 不能输出 string 对象,要输出只能输出 string.c_str()
        cout << "正在访问Building中的:"<< build->m_BedRoom.c_str() << endl;
}

void test01(){
        Goodgay g;
        g.visit1();
        g.visit2();
        
        
}
int main(){
        test01();
        
        system("pause");
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-12 09:57:18 | 显示全部楼层    本楼为最佳答案   
本帖最后由 xieglt 于 2020-11-12 10:00 编辑
#include <iostream.h>
#include <string>
#include <stdlib.h>

using namespace std;

class Goodgay;
class Building;

class Goodgay{
public:
        Goodgay(); 
        ~Goodgay();
        void visit1(); 
        void visit2();                  //visit2可以访问building私有成员 
        Building * build;
};

class Building
{
        friend void Goodgay::visit2();    //这里声明了友元
public:
       //可以这样赋值
        Building()
        {
                m_SettingRoom = "客厅";
                m_BedRoom = "卧室";
        }
public:
        string m_SettingRoom; // = "客厅";不能这么赋值
private:
        string m_BedRoom; // = "卧室" ;不能这么赋值
};


Goodgay::Goodgay()
{
        build = new Building;
        
}

//注意释放内存
~Goodgay::Goodgay()
{
        delete build;
}

void Goodgay::visit1()
{
        //cout 不能输出 string 对象,要输出只能输出 string.c_str()
        cout << "正在访问Building中的:" << build->m_SettingRoom.c_str() << endl;
}

void Goodgay::visit2()
{
        //cout 不能输出 string 对象,要输出只能输出 string.c_str()
        cout << "正在访问Building中的:"<< build->m_BedRoom.c_str() << endl;
}

void test01(){
        Goodgay g;
        g.visit1();
        g.visit2();
        
        
}
int main(){
        test01();
        
        system("pause");
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-12 22:50:40 | 显示全部楼层

不可以在成员变量定义的时候就赋值吗 我看语法好像没问题(虽然我知道构造函数赋值更标准一些)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-12 22:57:09 From FishC Mobile | 显示全部楼层
Ryan_Li 发表于 2020-11-12 22:50
不可以在成员变量定义的时候就赋值吗 我看语法好像没问题(虽然我知道构造函数赋值更标准一些)

不能赋值吧。至少我的编译器不支持。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 15:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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