C ++:使自定义类像容器和普通类一样工作?

时间:2011-02-24 01:45:54

标签: c++ class stl

我希望有一些myObject将存储SomeOtherObjects的集合(类似于矢量)(因此,是同质的,对吗?),它应该是可迭代的,并且可以通过{{1}访问但也会有(myObject[i]).SomeOtherObjectField1myObject.doStuff()等普通会员。

有没有选项来实现这样的类,或者使用私有std :: vector来保持对象(我试图避免 - 不喜欢私有std :: containers)会更聪明吗?

4 个答案:

答案 0 :(得分:1)

如果您的目标是代码重用,则首选组合而不是继承。 (继承应该用于启用多态,在这种情况下似乎不是问题。)

答案 1 :(得分:1)

这看起来像composite design pattern。简而言之,您必须定义Object类的接口并派生具体类,其中一些是其他类的容器。如上所述,组合方式更好,但使用通用接口是以相同方式使用“简单”对象或“复合”对象的方式。

MY2C

答案 2 :(得分:0)

我会使用private std::vector<>和内联方法来返回对它的const引用。 你为什么不喜欢成员标准容器?

答案 3 :(得分:0)

通常,正确的结构方法在于澄清语义。你需要提出类似的问题 “myObject是一个向量&lt;&gt;?”。答案可能不是。如果你遵循一个类做一件事(凝聚力)的原则,那么它遵循矢量&lt;&gt;周围的句法糖。可能不是那么好。

它倾向于遵循vector<>是私人会员。然后返回一个const引用没有问题。返回非const引用会破坏密码 - 也可能是公共数据。

如果您希望:

(myObject[i]).SomeOtherObjectMethod1();

然后通过operator[](unsigned index)很容易实现。我怀疑你是否希望你最好保持一致并将myObject本身视为一个容器。这意味着不向vector<>提供const ref访问器并实现您真正需要的特定访问器方法。这将使客户端代码更容易理解。