
请帮忙看下:声明类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的私有成员 展开
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的私有成员 展开
1个回答
展开全部
虽然在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
}
//------------------------------ 头文件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
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询