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, ' ');
}
これらの 2 つのクラスは、Window_mgr よりも最初に Screen を定義すると、期待どおりに動作します。ここで、この演習ではclear
、Screen のフレンドを作成して を定義するように求められますclear
。メンバーをclear
友達にするには、私の理解が正しけれWindow_mgr
ば、定義する必要があります。を定義するにはWindow_mgr
、を定義するScreen
必要があります。これは私には不可能に思えます。
テキストは次のヒントを提供します。
メンバー関数を友達にするには、プログラムを慎重に構造化して、宣言と定義の間の相互依存性に対応する必要があります。この例では、プログラムを次のように順序付ける必要があります。
まず、
Window_mgr
を宣言するが定義しないクラスを定義しますclear
。のメンバーを使用するScreen
前に宣言する必要があります。clear
Screen
次に、
Screen
のフレンド宣言を含むclass を定義しますclear
。最後に、
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 からこの演習を解決しましたか? もしそうなら、どのように?これをどのように行うことができるか、または私の腸が私に言うように、何か助けはありませんか?