封装迭代器提供的对象

时间:2016-10-26 13:21:59

标签: c++

我有一个名为newParam = [1.0, 0.02] norm_const = normalisation_omega(newParam, np.linspace(0.8, 1.2, 1E3)) omega_dist = omegaDistribution(name='omega_distribution', a = 1.0-0.2, b = 1.0+0.2) x_range = np.linspace(0.8, 1.2, 1E3) yVal = omega_dist.pdf(x_range, phi = 0.02, const = norm_const) samples = omega_dist.rvs(phi = 0.02, const = norm_const, size = 1E3) 的类,它在内部保存一个类型为Base的对象的容器。 然后我创建SomeType

现在我想在class Derived: protected Base类中创建自定义迭代器,以便用户能够迭代Derived类中容器中的对象。问题是Base提供了我想要提供的更多功能,即我想隐藏SomeType中提供的一些功能,并可能添加一些额外的数据字段和功能。

所以我试图做的一件事是像这样包裹SomeType

SomeType

然后在迭代器中的class AnotherType{ private: SomeType& object; public: //Make visible what I want } 内创建一个新的operator*()对象并将其返回。

我的问题在于,我不能这样做:

AnotherType

注意"&"在汽车。

在我不能添加任何额外数据字段的情况下,另一个可能的解决方案是使用this之类的东西。但是我认为它是未定义的行为。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

由于您希望迭代器返回引用,因此您需要有一个非临时对象,您可以返回引用。最简单的方法是让你的迭代器类包含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(); }
};