c++ - 具有派生类的自定义容器的迭代器

标签 c++ inheritance iterator

我有一个自定义容器,它以两种不同的方式实现,但只有一个界面。像这样的事情。

    class Vector 
    {
       virtual Iterator begin() = 0;
       virtual Iterator end () = 0 ;

    ... // some more functions.
    } ;

    class VectorImplA : public Vector
    {
       Iterator begin() { return m_data.begin() ; }
       Iterator end () { return m_data.end() ; }
    private:
       SomeFloatContainer m_data ;
    } ;

    class VectorImplB : public Vector
    {
       Iterator begin() { return m_data.end() ; }
       Iterator end() ; { return m_data.end() ; }


    private:
        std::vector <float> m_data ;

    } ;

我需要的是 Iterator 的统一接口(interface),以便我可以在基类中使用它。有什么想法吗?

最佳答案

我自己以前也遇到过这个问题。虽然有多种方法可以解决您的问题,但您很可能应该放弃 vector 基类的想法。您可能应该做的是模仿 c++ STL 容器的设计方式。

STL 包含概念 而不是基类。 std::vectorContainer 概念的模型,但不继承自 Container 基类。概念是概念的任何模型都应遵守的一组要求。参见 this例如,Container 要求的页面。

例如,Container 的要求声明您应该将容器内容的类型定义为 value_type,将迭代器定义为 iteratorconst_iterator。此外,您应该定义返回迭代器的 begin()end() 函数,等等。

然后,您需要更改对 Vector 基类进行操作的函数,改为对任何符合概念强加要求的类进行操作。这可以通过使函数模板化来完成。您不一定必须坚持 STL 使用的概念,您也可以自行编写。坚持 STL 中定义的概念还有一个额外的好处,即 STL 算法(例如 std::sort)可以在您的容器上运行。

简单示例:

class VectorImplA
{
public:
    typedef VectorImplAIterator iterator;

    iterator begin();
    iterator end();
};

class VectorImplB
{
public:
    typedef VectorImplBIterator iterator;

    iterator begin();
    iterator end();
};

template <typename VectorConcept>
void doSomeOperations(VectorConcept &container)
{
    VectorConcept::iterator it;
    it = container.begin();
}

int main()
{
    VectorImplA vecA;
    VectorImplB vecB;
    doSomeOperations(vecA); // Compiles!
    doSomeOperations(vecB); // Compiles as well!
}

作为奖励,为了回答最初的问题,请考虑以下设计(虽然我不会这样做!):

struct IteratorBase
{
    virtual void next() = 0;
};

struct IteratorA : IteratorBase
{
    void next() {};
};

struct IteratorB : IteratorBase
{
    void next() {};
};

class Iterator
{
    IteratorBase *d_base;
public:
    void next() { d_base->next(); }
};

关于c++ - 具有派生类的自定义容器的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2191572/

相关文章:

c++ - 左值到右值的隐式转换

c++ - 如何将 back_inserter 与转换结合起来,C++

c++ - C++ 中包含子类的基本抽象类数组

matlab - 如何在 Matlab 中检查一个类是否有特定的基类

c++ - 重写迭代器的运算符 *()

python - 如何构建一个基本的迭代器?

c++ - 将下载的种子保存在内存中而不是文件 libtorrent

c++ - 如何找到差异小于特定值的最大对数?

c++ - 迭代可执行文件本身时,std::filesystem::recursive_directory_iterator 崩溃

C++子级在复制构造函数和输出之间的某个时刻更改父级成员