如何实现一个大型容器类

How to implement a large container-like class?

本文关键字:一个 大型 容器类 实现 何实现      更新时间:2023-10-16

我有一个叫做"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)的标志是一个警告。

除了(非常好的)模板解决方案之外,还有一个接口类用于存储和检索对象,然后让它们在其他地方单独存在——您甚至可以为它们使用单独的容器,但仍然有一组代码来添加/删除接口类型的对象。