0

我的问题很简单。我正在学习朋友功能,但这由于某种原因不起作用。如果我用 Window_Mgr 类交换屏幕类,然后添加屏幕类的前向声明,它只会说。它不起作用是因为屏幕在那个时间点不知道“重新定位”的存在吗?

class Window_Mgr;
class screen
{
public:
    typedef string::size_type index;
    friend Window_Mgr& Window_Mgr::relocate(int, int, screen&);
private:
    int width, height;
};

class Window_Mgr
{
public:
    Window_Mgr& relocate(int r, int c, screen& s);
private:

};

Window_Mgr& Window_Mgr::relocate(int r, int c, screen& s)
{
    s.height=10;
    s.width=10;
};

int main(int argc, char* argv[])
{

    system("pause");
}
4

2 回答 2

2

您必须在Window_MgrBEFORE定义类screen,因为在您的代码中,编译器无法确保Window_Mgr确实有一个带有 name 的成员函数relocate,或者您只是在对它撒谎。编译器从上到下解析文件,在向下的过程中,它的工作是确保每个声明都是事实,而不是谎言!

由于relocate()采用 type 参数screen&,因此您必须提供前向声明screen

通过这些修复(以及其他次要修复),此代码现在可以正常编译(忽略愚蠢的警告)。

于 2013-01-18T15:56:00.627 回答
1

是的,Window_Mgr::relocate在朋友声明时是未知的。您必须Window_Mgr事先定义。

于 2013-01-18T15:54:29.610 回答