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

c – 具有派生类的自定义容器的迭代器,第1张

概述我有一个自定义容器,它以两种不同的方式实现,但只有一个接口.这样的事情. class Vector { virtual Iterator begin() = 0; virtual Iterator end () = 0 ; ... // some more functions. } ; class VectorImplA : pub 我有一个自定义容器,它以两种不同的方式实现,但只有一个接口.这样的事情.

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的统一接口,以便我可以在基类中使用它.有任何想法吗 ?

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

STL由概念而不是基类组成. std :: vector是Container概念的模型,但不从Container基类继承.概念是概念的任何模型应遵守的一组要求.有关Container的要求,请参见this页.

Container状态的要求,例如,您应该将容器内容的类型设置为value_type,并将typedef迭代器设置为iterator和const_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 – 具有派生类的自定义容器的迭代器全部内容,希望文章能够帮你解决c – 具有派生类的自定义容器的迭代器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1212721.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存