我正在尝试从 C++ Primer 5th Edition 做练习 7.32。该练习要求以下内容:
定义您自己的版本,
Screen
其中Window_mgr
是clear
的成员Window_mgr
和朋友Screen
。
以下是 的定义Screen
,Window_mgr
并clear
在正文中给出。
class Screen
{
public:
using pos = std::string::size_type;
Screen(pos ht, pos wd, char c) : height(ht), width(wd), contents(ht * wd, c) { }
private:
pos height = 0, width = 0;
std::string contents;
};
class Window_mgr
{
public:
using ScreenIndex = std::vector<Screen>::size_type;
void clear(ScreenIndex);
private:
std::vector<Screen> screens{Screen(24, 80 ' ')};
};
void Window_mgr::clear(ScreenIndex i)
{
Screen &s = screens[i];
s.contents = std::string(s.height * s.width, ' ');
}
现在这两个类,如果先定义 Screen 而不是 Window_mgr 可以按我的预期工作。现在,练习要求我结交clear
Screen 的朋友并定义clear
. 让clear
会员成为朋友,如果我理解正确,Window_mgr
必须定义。要定义Window_mgr
,Screen
必须定义。这对我来说似乎是不可能的。
文本给出了以下提示:
使成员函数成为朋友需要仔细构造我们的程序以适应声明和定义之间的相互依赖关系。在这个例子中,我们必须对我们的程序进行如下排序:
首先,定义
Window_mgr
类,该类声明但不定义clear
.Screen
必须在clear
可以使用 的成员之前声明Screen
。接下来,定义 class
Screen
,包括为clear
.最后是 define
clear
,它现在可以引用Screen
.
我试图解决这个练习的顺序最终是这样的:
class Screen;
class Window_mgr
{
public:
using ScreenIndex = std::vector<Screen>::size_type;
void clear(ScreenIndex);
private:
std::vector<Screen> screens{Screen(24, 80 ' ')};
};
class Screen
{
friend Window_mgr::clear(Window_mgr::ScreenIndex);
public:
using pos = std::string::size_type;
Screen(pos ht, pos wd, char c) : height(ht), width(wd), contents(ht * wd, c) { }
private:
pos height = 0, width = 0;
std::string contents;
};
void Window_mgr::clear(ScreenIndex i)
{
Screen &s = screens[i];
s.contents = std::string(s.height * s.width, ' ');
}
这显然是行不通的,因为其中的向量Window_mgr
需要Screen
是一个完整的类型。这似乎是一个无法解决的练习,除非作者不打算使用他们之前介绍Screen
的Window_mgr
类。
有没有其他人从 C++ Primer 中解决了这个练习。如果是这样,怎么做?任何帮助如何做到这一点,或者正如我的直觉告诉我的那样,无法做到?