请帮忙看下:声明类Y的成员函数g()为类X的友元函数,出错在哪里?

classY;//提前声明类YclassX{private:inti;public:friendvoidh(X*p){p->i+=10;};//普通的友元函数OKfrie... class Y;//提前声明类Y
class X
{
private:
int i;
public:
friend void h(X *p) { p->i+=10; } ;//普通的友元函数OK
friend void Y::g(X *p);//另一个类的成员函数声明为类X的友元函数
};

class Y
{
public:
void g(X *p){ p->i+=1; }//在Y中对X的私有成员加1
};
friend void Y::g(X *p);//另一个类的成员函数声明为类X的友元函数
如果去掉Y::类的作用域,那么提示g()不能访问X的私有成员
展开
 我来答
binglink
2012-02-27 · TA获得超过1101个赞
知道小有建树答主
回答量:639
采纳率:0%
帮助的人:480万
展开全部
虽然在class X声明之前有前置声明class Y; 但在 friend void Y::g(X *p)编译时,编译器并不知道class Y的结构, 不知道它有个成员函数数g, 所以这行编译不通过. 简单的做法是把这行改成 friend Y. 但这可能不是楼主的目的. 如果要实现楼主原来的想法需要增加两个头文件. 代码如下.

//------------------------------ 头文件x.h
#pragma once
#include "y.h"
class X
{
private:
int i;
public:
friend void h(X *p) { p->i+=10; } ;//普通的友元函数OK !!! //-------- 这里的friend 没有任何意义, 把自己的成员函数声明为自己的友元?
friend void Y::g(X *p);//另一个类的成员函数声明为类X的友元函数
};
//---------------------- 头文件y.h
#pragma once
class X;
class Y
{
public:
void g(X *p);
};

// -------------------------源程序xy.cpp
#include "x.h"
#include "y.h"
void Y::g(X *p)
{
p->i+=1; //在Y中对X的私有成员加1
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式