【发布时间】:2018-02-06 08:00:21
【问题描述】:
我创建了一个具有以下基本功能的抽象容器类
class AbstractInventory
{
private:
string name;
public:
AbstracInventory(string name);
virtual ~AbstractInventory();
virtual size_t size() const = 0;
virtual Stack* stackAt(size_t index) const = 0;
virtual Stack* &stackAt(size_t index) = 0;
Stack* operator[](int index) const { return(stackAt(index)); }
Stack* &operator[](int index) { return(stackAt(index)); }
};
例如,这可以是派生类之一
class BasicInventory : public AbstractInventory
{
private:
vector<Stack*> content;
public:
BasicInventory(string name, int size, bool sorting = false, ItemFilter* f=nullptr);
size_t size() const override { return(content.size()); }
Stack* stackAt(size_t index) const override { return(content[index]); }
Stack*& stackAt(size_t index) override { return(content[index]); }
};
现在我的问题是是否有可能使抽象接口和它的子级可迭代像矢量或列表一样在 foreach 循环中使用它
【问题讨论】:
-
实现
begin和end以返回迭代器 -
比这复杂一点,基类需要一个专门的迭代器类,重载的operator++、+、distance、begin()、end()会调用容器的虚函数。您可能只能以这种方式安全地实现前向迭代器。
-
@MichaëlRoy 或者只使用指针(当然只有在可能的情况下):)
-
@MichaëlRoy 派生类使用什么(如果有的话)作为其容器并不重要。
AbstractInventory要求通过索引访问元素,通过stackAt;任何派生类都别无选择,只能实现它。迭代器类只需要保存AbstractInventory指针及其当前索引。 -
为什么要从非常量方法返回对指针的引用?你打算做
void stuff(AbstractInventory ai) { ai[10] = new Stack(); ... }之类的事情吗?
标签: c++ inheritance interface iterator