一直报这个错,error: invalid use of incomplete type 'class X',为什么啊,我把X写在前面Y又不对了,就是一直有问题,请大家看看我应该怎么改

#include
using namespace std;
class X;
class Y
{
public:
void g(X *p)
{
p->i+=1;
}
};
class Z
{
public:
void f(X *p)
{
p->i+=5;
}
};
class X
{
int i;
public:
X(int ii)
{
i=ii;
}
friend class Z;
friend void Y::g(X *p);
friend void h(X *p)
{
p->i+=10;
}
void show(){cout<<"i="<<i<<endl;}
};
int main()
{
X x(1);
Y y;
Z z;
h(&x);
x.show();
y.g(&x);
x.show();
z.f(&x);
x.show();
return 0;

}


using namespace std;
class X;
class Y
{
public:
    void g(X* p);
};

class X
{
    int i;
public:
    X(int ii)
    {
        i = ii;
    }
    friend class Z;
    friend void Y::g(X* p);
    friend void h(X* p)
    {
        p->i += 10;
    }
    void show() { cout << "i=" << i << endl; }
};

void Y::g(X* p)
{
    p->i += 1;
}

class Z
{
public:
    void f(X* p)
    {
        p->i += 5;
    }
};

int main()
{
    X x(1);
    Y y;
    Z z;
    h(&x);
    x.show();
    y.g(&x);
    x.show();
    z.f(&x);
    x.show();
    return 0;

}
    当用到友元成员函数时,需注意友元声明和友元定义之间的相互依赖,类Y必须先定义,否则类X就不能将一个Y的函数指定为友元。然而,只有在定义了类X之后,才能定义类Y的该成员函数。更一般的讲,必须先定义包含成员函数的类,才能将成员函数设为友元。另一方面,不必预先声明类和非成员函数来将它们设为友元。