在其他头文件的头文件中包括类
include classes in header files in other header files
我有两个类屏幕和Window_Mgr(C++入门第5版第7章)。
- Screen 是一个包含三个字符串::size_types和一个字符串作为数据成员的类。
- Window_Mgr是一个类,其中包含类型为 vector
的对象 Screen。 - 它使用屏幕中的构造函数使用值 (24,80,'' ) 初始化 vector
>。 - void Window_Mgr::clear(vector::size_type i) 是一个访问字符串的私有成员并清除所有数据的函数。
我想以这样一种方式编写这段代码,只有 Window_Mgr::clear 是 Screen 的朋友。
我面临的问题是:
- 如果我使用不完整的声明在屏幕之前定义Window_Mgr,则无法初始化屏幕。
- 如果我在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_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
类。
相关文章:
- 命名空间中具有.h和.cpp文件的类
- C++头文件和类实现出现问题
- C++包括类名间距和类实例化
- 可执行文件C++包括.obj,.lib和.dll吗?
- 如何访问头文件中类的组件并打印它们的地址?
- 如何从另一个文件调用类构造函数?
- 为什么它无法在 c++ 中全局声明一个构建为 dll 文件的类?
- 不同文件的类,如何使其工作?
- 如何在另一个文件的类中声明函数
- 在单独的文件中类
- 错误:当定义两个带有标头文件的类时,将重新定义类
- 将单独的头文件和类定义文件链接到主函数文件 - G++ 返回重载"undefined reference to"构造函数
- 无法显示文件(与类有关)
- 如何将CPP文件包括在两个不同的CPP文件中
- 如何让头文件知道类继承
- 如何将程序拆分为文件C 类
- 如何将标题文件包括在C DLL文件中
- 在其他头文件的头文件中包括类
- 动态地包括类文件
- 包括.h文件2类