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

include classes in header files in other header files

本文关键字:文件 包括类 其他      更新时间:2023-10-16

我有两个类屏幕和Window_Mgr(C++入门第5版第7章)。

  1. Screen 是一个包含三个字符串::size_types和一个字符串作为数据成员的类。
  2. Window_Mgr是一个类,其中包含类型为 vector 的对象 Screen
  3. 它使用屏幕中的构造函数使用值 (24,80,'' ) 初始化 vector>
  4. void Window_Mgr::clear(vector::size_type i) 是一个访问字符串的私有成员并清除所有数据的函数。

我想以这样一种方式编写这段代码,只有 Window_Mgr::clear 是 Screen 的朋友。

我面临的问题是:

  1. 如果我使用不完整的声明在屏幕之前定义Window_Mgr,则无法初始化屏幕
  2. 如果我在Window_Mgr之前定义屏幕,则声明不完整,则无法将Window_Mgr::clear声明为屏幕的朋友。

我尝试将它们包含在单独的头文件中,但这真是一团糟。

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

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

你window_mgr清楚的会是这样的

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

你的屏幕清晰会像这样

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

正如我的一位教授敲打我们的脑海"课堂的朋友不是程序员的朋友"

你通过调用Window_Mgr Screen违反了封装。

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