C++友元函数问题,类的成员函数无法访问私有成员

MyZony 2014-12-08 10:46:44
class X
{
public:
friend bool Y::ifelse(X&);
private:
int a;
int b;
};

class Y
{
public:
bool ifelse(X& temp)
{
return temp.a > temp.b ? true : false;
}
};

以上是代码,在VS2013当中会报错,提示如下:

class Y ; //注意这里,前导声明
class X
{
public:
friend bool Y::ifelse(X&);
private:
int a;
int b;
};
class Y
{
public:
bool ifelse(X& temp)
{
return temp.a > temp.b ? true : false;
}
};


依然是报错,换成以下代码依然是错误:
class Y
{
public:
bool ifelse(X& temp)
{
return temp.a > temp.b ? true : false;
}
};
class X
{
public:
friend bool Y::ifelse(X&);
private:
int a;
int b;
};


编译环境是VS2013,求各位大神解答。
...全文
5360 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
SK_AJIE 2016-11-27
  • 打赏
  • 举报
回复
友元函数原来可以这么写,新型?
yanheriver 2016-11-25
  • 打赏
  • 举报
回复
friend bool Y::ifelse(X&);改成friend class Y 我用vs2013编译时也出现同样的问题,改成友元类就好了 虽然改变你的愿意,但这就是规矩
yulinlang 2014-12-10
  • 打赏
  • 举报
回复
因为如果定义在类内部的话,函数需要访问temp的成员变量,此时类X还没有定义,当然无法访问。 所以在类的定义时仅仅声明函数,把函数的定义放到类X的定义之后,这时候就可以正常访问类X的成员变量了。 至于IntelliSense,那是它的bug,不用管它
MyZony 2014-12-09
  • 打赏
  • 举报
回复
引用 2 楼 yulinlang 的回复:

class X;
class Y
{
public:
    bool ifelse(X& temp);
};

class X
{
public:
    friend bool Y::ifelse(X&);
private:
    int a;
    int b;
};

bool Y::ifelse(X& temp)
{
    return temp.a > temp.b ? true : false;
}
是可以通过编译,但是为什么在类的内部定义函数就汇报错呢? 而且虽然可以通过编译,但是仍然会有: 2 IntelliSense: 成员 "X::b" (已声明 所在行数:15,所属文件:"c:\users\administrator\documents\visual studio 2013\projects\consoleapplication_2014120702\consoleapplication_2014120702\Test.h") 不可访问 c:\Users\Administrator\Documents\Visual Studio 2013\Projects\ConsoleApplication_2014120702\ConsoleApplication_2014120702\Test.h 20 23 ConsoleApplication_2014120702 1 IntelliSense: 成员 "X::a" (已声明 所在行数:14,所属文件:"c:\users\administrator\documents\visual studio 2013\projects\consoleapplication_2014120702\consoleapplication_2014120702\Test.h") 不可访问 c:\Users\Administrator\Documents\Visual Studio 2013\Projects\ConsoleApplication_2014120702\ConsoleApplication_2014120702\Test.h 20 14 ConsoleApplication_2014120702 这两个IntelliSense提示,这是为什么呢?求大神解惑。
yulinlang 2014-12-08
  • 打赏
  • 举报
回复

class X;
class Y
{
public:
    bool ifelse(X& temp);
};

class X
{
public:
    friend bool Y::ifelse(X&);
private:
    int a;
    int b;
};

bool Y::ifelse(X& temp)
{
    return temp.a > temp.b ? true : false;
}
小布 2014-12-08
  • 打赏
  • 举报
回复 2
只有当一个类的定义已经被看到时它的成员函数才能被声明为另一个类的友元。这并不总是能够做到的。 例如如果Screen 类必须把Window 类的成员函数声明为友元,而Window类必须把Screen 类的成员函数声明为友元。该怎么办呢?在这种情况下可以把整个Window类声明为Screen 类的友元。

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧