我有一个自定义容器,它以两种不同的方式实现,但只有一个界面。像这样的事情。
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::vector
是 Container
概念的模型,但不继承自 Container
基类。概念是概念的任何模型都应遵守的一组要求。例如,请参阅 this 页面了解 Container
的要求。
例如,Container
的要求是,您应该将容器内容的类型定义为 value_type
,将迭代器定义为 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++ - 具有派生类的自定义容器的迭代器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2191572/