我想要一个可以在我的代码中以不同方式继承和实现的类接口(我们称其为A类),并且该接口包含一些函数,包括stl类型迭代器,该迭代器定义为嵌套类。
我的问题是,每当我尝试继承接口(让我们称为类B)以及迭代器并实现它们时,继承的类的开始和结尾都期望类型为A :: iterator的迭代器,即使B类中的迭代器继承自A :: iterator。我知道多态只适用于指针/引用,但我将如何做到这一点?
我也尝试过与朋友班级一起做,但是我真的不知道它们是如何工作的,因为我以前从未使用过它们,所以结果有点混乱。这是一些示例代码(我实际运行的代码)
class A
{
public:
class iterator
{
public:
virtual Entity& operator*() const = 0;
virtual bool operator!=(const iterator) const = 0;
virtual bool valid() const = 0;
virtual iterator& operator=(const iterator& it) = 0;
virtual iterator operator++() = 0;
virtual iterator operator++(int) = 0;
virtual ~iterator() {};
};
virtual int add(const std::vector<std::string>& params) = 0;
virtual int remove(const std::vector<std::string>& params) = 0;
virtual int update(const std::vector<std::string>& params) = 0;
virtual int save(const std::vector<std::string>& params) = 0;
virtual int size() = 0;
virtual typename iterator begin() = 0;
virtual typename iterator end() = 0;
virtual ~A() {}
};
class B: public A
{
private:
std::vector<Entity> elements;
public:
class iterator : public A::iterator
{
private:
std::vector<Entity>::iterator ptr;
B& repo;
public:
iterator(std::vector<Entity>::iterator ptr, B& container) : ptr{ ptr }, repo{ container }{}
Entity& operator*() const override;
bool operator!=(const iterator) const override;
bool valid() const override;
iterator& operator=(const iterator& it) override;
iterator operator++() override;
iterator operator++(int) override;
};
B() : elements{ std::vector<Entity>() } {}
int add(const std::vector<std::string>& params) override;
int remove(const std::vector<std::string>& params) override;
int update(const std::vector<std::string>& params) override;
int save(const std::vector<std::string>& params) override;
int size() override;
typename iterator begin();
typename iterator end();
~B() {};
};
我之所以要这样做,是因为我必须创建2个不同的存储库,其中一个使用文件,一个在内存中,并且将来可能需要一个数据库,但我只是不能通过继承来获得正确的迭代器。返回一个std :: vector会快很多,但也有点作弊。 编辑:我最终要实现的目标是拥有两个具有相同接口的存储库,并且这些存储库也可以通过它们进行迭代,其中一个在std :: vector上实现,另一个在文件上直接实现。这意味着向量回购的迭代器必须只给我const std :: vector迭代器,而另一个则必须以只读方式打开文件,转到下一行等。我必须使它们与基于循环的范围兼容。