C++的类做友元使用问题

这样写为什么是错误的?已经提前声明了mygoods,但是为什么还是会报错未定义,把mygoods修改到goodgay之前定义,就不会有问题
编译错误提示:


```c++
invalid use of incomplete type 'class mygoods'
invalid use of incomplete type 'class mygoods'
invalid use of incomplete type 'class mygoods'


程序代码如下:
#include <iostream>
using namespace std;
#include <string>
class mygoods;
class goodgay
{
public:
    goodgay()
    {
        goods = new mygoods;
    }
    void usegoods()
    {
        cout<<"use public:"<<goods->gs1<<endl;
        cout<<"use public:"<<goods->gs2<<endl;
    }
    mygoods *goods;
};

class mygoods
{
    friend class goodgay;
public:
    mygoods()
    {
        gs1 = "抽纸";
        gs2 = "水杯";
    }
    string gs1;
private:
    string gs2;
};

void test01(void)
{
    goodgay gay1;
    gay1.usegoods();
}
int main(void)
{

    cout<<"hello world"<<endl;
    test01();
    system("pause");
    return 0;
}

```

#include <iostream>
using namespace std;
#include <string>
class mygoods;
class goodgay
{
public:
    goodgay();
    void usegoods();
    mygoods *goods;
};
 
class mygoods
{
    friend class goodgay;
public:
    mygoods()
    {
        gs1 = "抽纸";
        gs2 = "水杯";
    }
    string gs1;
private:
    string gs2;
};

goodgay::goodgay()
{
    goods = new mygoods;
}

void goodgay::usegoods()
{
    cout<<"use public:"<<goods->gs1<<endl;
    cout<<"use public:"<<goods->gs2<<endl;
}

void test01(void)
{
    goodgay gay1;
    gay1.usegoods();
}
int main(void)
{
 
    cout<<"hello world"<<endl;
    test01();
    system("pause");
    return 0;
}

另外,英文单词不晓得含义的去查一查,别瞎用。

【以下回答由 GPT 生成】

问题分析: 在C++中,类之间可以使用友元函数和友元类进行访问。友元函数和友元类能访问对方类的私有成员。在给类定义友元时,被授予权限的类要先定义好,否则无法正常编译。

解决方案: 问题出现在goodgay类中,它在定义时使用了mygoods类,但是在那时mygoods类还没有定义。解决这个问题的方法是将goodgay类定义放在mygoods类定义之后。

修改后的代码如下:

#include<iostream>
using namespace std;
#include<string>

class mygoods;

class goodgay
{
public:
    goodgay()
    {
        goods = new mygoods;
    }
    void usegoods()
    {
        cout<<"use public:"<<goods->gs1<<endl;
        cout<<"use private:"<<goods->gs2<<endl;
    }
    mygoods *goods;
};

class mygoods
{
    friend class goodgay;
public:
    mygoods()
    {
        gs1 = "抽纸";
        gs2 = "水杯";
    }
private:
    string gs1;
    string gs2;
};

void test01()
{
    goodgay gay1;
    gay1.usegoods();
}

int main()
{

    cout<<"hello world"<<endl;
    test01();
    system("pause");
    return 0;
}

现在编译正常,并且输出结果如下:

hello world
use public:抽纸
use private:水杯

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^