0

Screen と Window_Mgr (C++ Primer 5th Edition Chapter 7) の 2 つのクラスがあります。

  1. Screen は、3 つのstring::size_types文字列をデータ メンバーとして含むクラスです。
  2. Window_Mgr は、 vector< Screen >型のオブジェクトScreensを含むクラスです。
  3. Screen のコンストラクターを使用して、ベクトル < Screen >を値(24,80,' ')で初期化します。
  4. void Window_Mgr::clear(vector::size_type i)は、string のプライベート メンバーにアクセスし、すべてのデータをクリアする関数です。

Window_Mgr::clear だけが Screen のフレンドになるように、このコードを書きたいと思います。

私が直面している問題は次のとおりです。

  1. Screen の前に Window_Mgr を不完全な宣言で定義すると、 Screens を初期化できませ
  2. Window_Mgr の前に Screen を不完全な宣言で定義すると、 Window_Mgr::clearをScreenのフレンドとして宣言できません。

私はそれらを別々のヘッダーファイルでインクルードしようとしましたが、それは本当に混乱でした.

#include <iostream>
#include <vector>

class Screen;

struct Window_Mgr{
public:
    //    using Screen_Index = std::vector<Screen>::size_type;
    typedef std::vector<Screen>::size_type Screen_Index;

    void clear(Screen_Index i);

    Window_Mgr() = default;

private:
    std::vector<Screen> Screens;
};



struct Screen{

    typedef std::string::size_type pos;

    friend void Window_Mgr::clear(Screen_Index i);

    Screen() = default;
    Screen(pos h, pos w, char s): height(h), width(w), contents(h*w,s){};

    char get() const { return contents[cursor];}
    char get(pos ht, pos width)const;
    Screen &move(pos r, pos c);
    Screen &set(char);
    Screen &set(pos, pos, char);
    Screen & display(std::ostream &);
    const Screen & display (std::ostream &) const;

    pos size() const;


private:
    pos cursor = 0;
    pos height = 0, width = 0;
    std::string contents;
    const Screen do_display (std::ostream& os) const
    {
        os << contents;
        return *this;
    }
};
4

2 に答える 2

2

代わりにクラスを使用することを検討してください。前方宣言は、画面を構造体として作成するクラス用です。これは、いくつかの問題を引き起こしている可能性があります。友人を使用する代わりに、Screen で別のクリア関数を呼び出す Window_mgr 用の 2 つの個別のクリア関数についてはどうですか。

あなたの window_mgr clear は次のようになります

void Window_Mgr::clear(int i)
{
    Screens.at(i).clear();
}

あなたのスクリーンクリアは次のようになります

void Screen::clear()
{
    //whatever you want to do to private variables here
}

そして、私の教授の一人が私たちの頭を叩いたように、「クラスの友達はプログラマーの友達ではない」

于 2013-11-09T19:02:50.533 に答える
1

Screencallを持つことで、カプセル化に違反していますWindow_Mgr

はs のWindow_MgrコンテナですScreen。は、画面のメソッドを Window_Mgr呼び出す必要があります。clear

struct Screen
{
  void clear()
  {
     //...
  }
};


struct Window_Mgr
{
  std::vector<Screen> Screen_Container;
  void clear_screen(unsigned int screen_index)
  {
    Screen_Container[screen_index].clear();
  }
};

簡単にするために、インデックス範囲のチェックは入れていません。

編集 1: 友情。
ここに友情は必要ありません。は、クラスがそのインターフェイスで定義した Window_Mgrものにのみアクセスできます。Screen

また、Screenクラスはコンテナ内にあるかどうかを認識できません。その概念はクラスに属しWindow_Mgrます。

于 2013-11-09T19:20:14.593 に答える