友元 ,在类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 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-17 20:58
你的思路基本没有问题,但是声明和定义循序有问题,你要确定哪里一个优先声明和定义:(注:这里用提前声明 ...
你这是在类外面实现成员函数,我是在类内。和声明与否没关系把 猪猪虾 发表于 2022-1-19 21:20
你这是在类外面实现成员函数,我是在类内。和声明与否没关系把
大哥,写代码很辛苦,尤其是特长代码,希望你认真看清楚。
我拿其中一个例子,你的 GoodGay() 是 GoodGay 的构造函数,在 GoodGay 里面声明了,但是必须 Building 之后才能定义。
你的代码牵涉很多声明和定义顺序。
如果用你的代码执行,报错已经说明一切!
猪猪虾 发表于 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]