如何实现一个大型容器类
How to implement a large container-like class?
我有一个叫做"System"的大类(我想把"System"改成"House")。系统中包含不同类型的对象,如窗、门等。不同类型的对象不能被视为具有相同的基类。为了构建系统,我需要逐个添加这些不同类型的对象。而删除一个、清除全部等其他方法也需要对系统进行管理。我在比较两种方法。一是实现类系统接口中的所有方法。另一种方法是公开对象的内部容器,并让用户调用容器的方法来执行此操作。我认为第一个应该更好,但有这么多类似的代码,我需要写,如果我有许多不同的类型?有更好的方法吗?谢谢。
class System
{
public:
AddDoor(Door);
DeleteDoor(Door);
DeleteAllDoors();
...
AddWindow(Window);
DeleteWindow(Window);
DeleteAllWindows();
...
......
private:
vector<Door> m_doors;
vector<Window> m_windows;
}
class System
{
public:
vector<Door>& Doors();
vector<Window>& Windows();
...
private:
vector<Door> m_doors;
vector<Window> m_windows;
}
您的实现看起来像这样:
class System {
public:
#if YOU_ARE_USING_C++11
template<typename... Args>
void Add(Args &&... args) {
GetContainer<T>().emplace_back(std::forward<Args>(args)...);
}
#else
template<typename T>
void Add(T const & t) {
GetContainer<T>().push_back(t);
}
#endif
template<typename T>
void Delete(T const & t) {
std::vector<T>::iterator position = std::find(GetContainer<T>().begin(), GetContainer<T>().end(), t);
GetContainer<T>().erase(position);
}
private:
template<typename T>
std::vector<T> & GetContainer();
};
template<>
std::vector<Doors> & System::GetContainer() {
return m_doors;
}
template<>
std::vector<Windows> & System::GetContainer() {
return m_windows;
}
你在找这样的东西吗?如果不进一步了解你的问题,很难说什么是"最佳"设计。
话虽如此,有时将类作为公共成员而不仅仅是函数可能更合适。
面向对象设计的一个关键原则是"隐藏实现细节"[当然,即使在不使用面向对象设计时也应该考虑这一点]。
在这种情况下,这意味着您不应该向调用代码公开存储在vector中的内容。如果你决定"Vector不适合这种类型的东西,我需要使用map、list、tree或……"这意味着至少要修改一些代码,对吗?如果您有很多代码,这不是一件好事。
所以,你的第一个想法是这里给出的两个想法中更好的一个。
有一件事让我有点担心,那就是这个类被称为"System"。这通常意味着类是一个上帝对象——它包含一切,也是一切。一般来说,类应该尽可能的小和简单。
我不确定你是否有一个"上帝对象",但根据Scott Meyers的《Effective c++》一书,它被称为system(或manager)的标志是一个警告。
除了(非常好的)模板解决方案之外,还有一个接口类用于存储和检索对象,然后让它们在其他地方单独存在——您甚至可以为它们使用单独的容器,但仍然有一组代码来添加/删除接口类型的对象。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- C/C++ 从 STM32 中的另一个类获取大型数据,如 180 数组
- 设计一个具有大型成员的C++类,而这些成员很少在副本中访问
- 将一个大型c++程序拆分为几个组件
- 如果我只需要它的几个函数,是否值得包含一个大型C++库
- 如何为大型项目制作一个简单的工具来检测Linux中的双倍空闲或内存溢出
- 在一个不熟悉的大型软件项目中,我应该如何调试SIGFPE
- 如何从一个大型文本文件读取到一个数组c++
- 大型项目的MPI编码实践多个MPI_Finalize();或者只是一个
- 每个大型项目都包含一个Lisp解释器吗
- 在C++中并行读取一个大型文本文件
- 在Rcpp中分配一个大型的二维数字向量数组
- 如何实现一个大型容器类
- 在一个大型社交网站上用PHP实现哪些东西是昂贵的