【问题标题】:C++: making custom class to work like both container and normal class?C++:让自定义类像容器类和普通类一样工作?
【发布时间】:2011-07-03 05:43:12
【问题描述】:

我想要一些 myObject 来存储 SomeOtherObjects 的集合(类似矢量)(所以,是同质的,对吗?),它应该是可迭代的,并且可以通过 (myObject[i]).SomeOtherObjectField1 访问,但也将具有正常的myObject.doStuff()myObject.Stuff 这样的成员。

是否有任何选项可以实现此类,或者使用私有 std::vector 来保留对象(我试图避免 - 不喜欢私有 std:: 容器)会更聪明?

【问题讨论】:

  • "不喜欢私有 std:: 容器" 为什么不呢?

标签: c++ class stl


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    通常,正确的结构方法在于澄清语义。你需要问一些问题,比如 “myObject 是矢量 吗?”。答案很可能不是。如果你遵循一个类做一件事(内聚)的原则,那么围绕向量的语法糖可能不是那么好。

    vector<> 往往是私人成员。然后返回对它的 const 引用没有问题。返回非常量引用会破坏封装 - 也可能是公共数据。

    如果你想拥有:

    (myObject[i]).SomeOtherObjectMethod1();
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        my2c

        【讨论】:

          猜你喜欢
          • 2010-10-23
          • 1970-01-01
          • 1970-01-01
          • 2021-10-15
          • 1970-01-01
          • 2014-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多