Sur*_*rya 4 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 ;
} ;
Run Code Online (Sandbox Code Playgroud)
我需要的是Iterator的统一接口,以便我可以在基类中使用它.有任何想法吗 ?
我以前自己遇到过这个问题.虽然有很多方法可以解决您的问题,但您很可能应该放弃向量基类的想法.您可能应该做的是模仿c ++ STL容器的设计方式.
STL由概念而不是基类组成.An std::vector是Container概念的模型,但不从Container基类继承.概念是概念的任何模型应遵守的一组要求.例如,请参阅此页面了解要求Container.
对Container状态的要求,例如你应该将容器内容的类型设置为value_type,并将typedef iterators设置为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!
}
Run Code Online (Sandbox Code Playgroud)
作为奖励,要回答原始问题,请考虑以下设计(我不会这样做!):
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(); }
};
Run Code Online (Sandbox Code Playgroud)