【问题标题】:Better interface for a class that hide container隐藏容器的类的更好接口
【发布时间】:2025-12-05 11:05:01
【问题描述】:

我有MyClass 将容器隐藏在其中,我想控制何时将新项目添加到容器中以及何时从容器中删除项目,但我不需要控制只读操作比如getter函数

class MyClass {
    protected: 
        std::vector<MySubClass> subclasses;
    public:
}

为了与MyClass的用户进行交互,我是否应该实现如下接口函数:

addSubClass()getSubClassAt(int )getSubClassIndex(MySubclass )delSubClass()

或者最好只返回常量迭代器,用于只读操作:

std::vector&lt;MySubClass&gt;::const_iterator getSubclassIterator();

并提供特殊的写操作功能,如

addSubClass()delSubClass()

或者有比这些更好的方法吗?

【问题讨论】:

标签: c++ stl interface iterator containers


【解决方案1】:

如果您发明了自己的成员函数来操作内部对象列表,那么当我想使用您的类时,我将不得不学习您的接口。

我更喜欢你使用我已经知道的标准库的约定,所以我可以立即使用你的类:

class MyClass {
    protected: 
        std::vector<MySubClass> subclasses;
    public:
        typedef std::vector<MySubClass>::const_iterator const_iterator;

        const_iterator begin() const {return subClasses.begin();}
        const_iterator end  () const {return subClasses.end  ();}

        void insert(const_iterator where, const MySubClass& obj);
        iterator erase(iterator pos);
        iterator erase(iterator begin, iterator end);

        // ...
}

【讨论】:

  • 如果 MyClass 只是另一个容器类,这是正确的。但是,例如,如果 MyClass 是某种领域对象的存储库,那么这样的接口并没有真正的表现力。 MyClass 的用户可能想知道 MyClass 的开头或和是,如果这对 MyClass 没有意义。这里使用领域语言的界面更容易理解。
【解决方案2】:

如果您提供适用于您的容器的标准库容器调用的子集,您的用户将非常感激:例如 push_backbeginendfind 之类的东西。如果您重新设计接口,客户将更难理解,并且它并不总是与标准算法兼容。

【讨论】:

    最近更新 更多