在完成C++教程5-13作业的时候我发现了一个这样的问题,当需要把一个函数的成员函数当做另外一个函数的友元函数的时候,可能是存在一个约定俗成的规则,或者是一个编译器偶然现象,如果读完了有一些想法可以在评论区留下你的意见。
#include"pch.h"
#include<iostream>
using namespace std;
class X;
class Y {
public:
void g(X *p);
};
class X {
public:
X(int i = 0) { this->i = i; }
void showNum() { cout <<"当前i的值是:"<< i << endl; }
friend void h(X *p) { p->i += 10; }
friend void Y::g(X *p);
friend class Z;
private:
int i;
};
class Z {
public:
void f(X *p) { p->i += 5; }
};
//为什么逻辑分离出来就可以,写在Y类里面就是会报错?
void Y::g(X *p)
{
(p->i)++;
}
using namespace std;
int main()
{
X x(5);
x.showNum();
X *p;
X *p1;
X *p2;
p1 = &x;
p2 =p1;
p =p1;
Y y;
Z z;
h(p);
x.showNum();
y.g(p1);
x.showNum();
z.f(p2);
x.showNum();
}
大家可以发现我在X中用域符号声明Y的成员函数是X的友元函数。
在Y类中的声明:
函数的g()在外部实现:
但是我如果把这个函数实现和函数声明在类Y中不分离的话就会报错:
我也有和老师讨论过,在网上查询解答可能是一个约定俗成的规则。对于这个问题,我想呢,以后在写类的时候尽可能的使用逻辑分离把类中的方法在类外部养成这样的编程习惯。