包括其他头文件中的头文件中的类

时间:2013-11-09 17:40:21

标签: c++ header include forward-declaration

我有两个类Screen和Window_Mgr(C ++ Primer第5版第7章)。

  1. Screen是一个包含三个 string :: size_types 和一个字符串作为数据成员的类。
  2. Window_Mgr是一个类,其中包含矢量< Screen > 类型的屏幕对象。
  3. 使用屏幕中的构造函数,使用值(24,80,'')初始化向量&lt; 屏幕&gt; 。< / LI>
  4. void Window_Mgr :: clear(vector :: size_type i)是一个访问字符串私有成员并清除所有数据的函数。
  5. 我想以这样的方式编写此代码,即只有Window_Mgr :: clear才是Screen的朋友。

    我面临的问题是:

    1. 如果我在屏幕前使用不完整的声明定义Window_Mgr,我无法初始化屏幕
    2. 如果我在Window_Mgr之前使用不完整的声明定义屏幕,我不能将 Window_Mgr :: clear 声明为屏幕的朋友。
    3. 我尝试将它们包含在单独的头文件中,但这真是一团糟。

      #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;
          }
      };
      

2 个答案:

答案 0 :(得分:1)

考虑使用类而不是你的前向声明用于一个类,你可以在其中创建一个结构。这可能会导致您的一些问题。而不是使用朋友如何为Window_mgr调用两个单独的清除函数,在Screen中调用不同的清除函数。

你的window_mgr清楚就像是

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

你的屏幕清晰就像是

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

当我的一位教授击败我们的脑袋时“课堂上的朋友不是程序员的朋友”

答案 1 :(得分:1)

您通过Screen调用Window_Mgr来违反封装。

Window_MgrScreen s的容器。 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类。