0

这是从 C++ 角度来看的一般设计问题。我有一个容器类,其中包含 2 个其他类的对象。

从容器类中,我们可以调用包含的类对象的方法,“因为我们拥有包含的类对象的句柄”,例如 objContainedClass1->SomeMthod();

但是我想知道容器类的包含类对象(objContainedClass1)如何访问方法。

我可以想到以下几种方式:

  1. 容器类对象将指向自身的指针(this 指针)传递给包含的类构造函数。使用这个指针,被包含的类可以访问容器类的方法。

  2. 将容器类中的一些函数设为静态。

还有更多实现这一目标的想法吗?

谢谢

4

5 回答 5

7

不要,通常一个类必须知道它的容器是不好的设计。通常这意味着你违反了单一责任原则。

于 2010-09-14T13:58:47.530 回答
2

两种方式都可以用于不同的目的。如果您只需要调用静态方法,#2 就可以了。但是如果你需要访问容器类的实例方法,你需要有容器类指针,所以#1是方法。

如果您需要通用解决方案,请实施观察者模式。在这种情况下,包含的类对容器一无所知,它只是在必要时引发事件。

于 2010-09-14T14:01:13.947 回答
1

有许多糟糕的选择。

如果它们不在容器类之外使用,您可以使包含的类成为容器类的一部分。

您可以使容器成为所包含类的朋友(讨厌)。

您可以将引用或 boost::shared_ptr 传递给容器,而不是原始指针。最好的方法取决于每个人的寿命。如果可以,请避免使用原始指针。

我实际上会尝试做的是隔离包含的对象需要使用的容器方法的接口(IContainerCallback例如),并将其用作两者之间的链接。因此,包含的对象仅通过与容器的实现分离的接口类间接引用容器。

于 2010-09-14T14:02:43.117 回答
0
  • 将容器类中的一些函数设为静态。

这就是所谓的“再见OOP!” 选项,我尽量避免使用它。

  • 容器类对象将指向自身的指针(this 指针)传递给包含的类构造函数。使用这个指针,被包含的类可以访问容器类的方法。

假设包含类实现了一个接口并且包含的​​类只知道接口,我个人认为没有任何问题。事实上,这就是我自己所做的。显然,必须注意该方法的陷阱,例如,当包含的对象在后者的销毁期间调用容器的方法时(或容器处于中间状态的任何其他时刻)。

为了进一步将包含的内容与包含的类解耦,也可以使用事件或消息。包含的对象不知道它们包含在哪里,而是发送消息。在创建包含对象时,包含对象将自己注册为来自它们的消息的接收者。该技术允许使对象在字面上独立,但需要 (1) 一些消息传递框架,(2) 由于 C++ 的静态特性,实现起来相当复杂, (3) 还需要额外级别的文档,因为类的接口现在包括消息传递。

否则,请三思为什么包含的对象需要调用容器的方法。是不是您需要将容器中的一些通用功能拆分为第三类?如果包含的对象确实是活动对象并且是系统中事件的逻辑源,那么您可能确实需要一些基本的事件/消息传递系统来允许容器有效地轮询/监视包含对象中的状态更改。

于 2010-09-14T14:29:47.193 回答
-1

不。容器类的职责是包含事物,仅此而已。如果您需要容器类根据其中包含的内容执行操作,请让第三个对象执行这些操作。例如,我假设您正在根据类的内容重新排列或以其他方式修改类的集合。不要尝试在包含的类中执行此操作,而是在使用容器作为依赖项的类中执行此操作。

于 2010-09-16T14:46:07.870 回答