我有一个名为 Base
的类,它在内部包含一个类型为 SomeType
的对象容器。
然后我创建 class Derived: protected Base
。
现在我想在 Derived
类中创建自定义迭代器,以便为用户提供迭代 Base
类容器中对象的能力。问题是 SomeType
提供了更多我想提供的功能,即我想隐藏 SomeType
中提供的一些功能,并可能添加一些额外的数据字段和功能。
所以我尝试做的一件事是像这样包装 SomeType
:
class AnotherType{
private:
SomeType& object;
public:
//Make visible what I want
}
然后在迭代器的 operator*()
中创建一个新的 AnotherType
对象并返回它。
我的问题是,我不能这样做:
Derived d;
for(auto& object: d)
// Use object however i like.
注意 auto 中的“&”。
在我不添加任何额外数据字段的情况下,另一种可能的解决方案是使用类似 this 的方法。 .但正如我所见,这是未定义的行为。
有什么想法吗?
最佳答案
由于您希望迭代器返回引用,因此您需要有一个可以返回引用的非临时对象。最简单的方法是让迭代器类包含 AnotherType
的实例,并让 AnotherType
的成员成为 Base
的迭代器> 而不是引用,以便在修改 Derived
迭代器时可以更新它。
class AnotherType{
private:
Base::iterator iter;
public:
AnotherType(Base::iterator it) : iter(it) { }
//Make visible what I want
void Foo() { iter->Foo(); }
};
关于c++ - 封装迭代器提供的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40263487/