这是从C ++角度来看的一般设计问题。我有一个容器类,其中包含其他2个类的对象。
从容器类中,我们可以调用包含的类对象的方法“因为我们已经处理了包含的类对象”,例如objContainedClass1-> SomeMthod();
但是我想知道包含的类对象(objContainedClass1)如何访问容器类的方法。
我可以想到以下方法:
容器类对象将指向自身的指针(this指针)传递给包含的类构造函数。使用此指针,包含的类可以访问容器类的方法。
将容器类中的某些函数设置为静态。
更多关于实现这一目标的想法?
由于
答案 0 :(得分:6)
不要,通常一个类必须知道它的容器是不好的设计。通常这意味着你违反了单一责任原则。
答案 1 :(得分:2)
两种方式都适用于不同的目的。如果您只需要调用静态方法,那么#2就可以了。但是如果你需要访问容器类的实例方法,你需要有容器类指针,所以#1就是这样。
如果您需要通用解决方案,请实现观察者模式。在这种情况下,包含的类对容器一无所知,它只是在必要时引发事件。
答案 2 :(得分:1)
有许多不好的选择。
如果容器类不在其外部使用,则可以使包含的类成为容器类的一部分。
你可以让容器成为所包含类的朋友(yuck)。
您可以将引用或boost :: shared_ptr传递给容器而不是原始指针。最好的方法取决于每个人的生命周期。如果可以,请避免使用原始指针。
我实际上要做的是隔离包含对象需要使用的容器方法的接口(例如IContainerCallback
),并将其用作两者之间的链接。因此,包含的对象仅通过与容器实现分离的接口类间接引用容器。
答案 3 :(得分:0)
- 将容器类中的某些函数设置为static。
这就是所谓的“再见OOP!”选项,我尽可能不使用它。
- 容器类对象将指向自身的指针(this指针)传递给包含的类构造函数。使用此指针,包含的类可以访问容器类的方法。
如果包含类实现了一个接口并且包含的类只知道接口,我个人看不到任何问题。事实上,这就是我自己做的事情。显然,人们必须意识到这种方法的问题,例如,包含对象在销毁后者时(或容器处于中间状态的任何其他时刻)调用容器的方法。
要进一步将包含的内容与包含的类分离,还可以使用事件或消息。包含的对象不知道它们包含在哪里,而是发送消息。创建包含对象时包含对象将自身注册为来自它们的消息的接收者。该技术允许使对象字面上独立,但需要(1)一些消息传递框架,(2)由于C ++的静态特性而非精心实现,(3)还需要更多级别的文档,因为类的接口现在包括消息传递。
否则,请三思而后行包含对象需要调用容器的方法。难道你需要将容器中的一些通用功能拆分成第三类吗?如果包含的对象确实是活动对象并且是系统中事件的逻辑源,那么您可能确实需要一些基本的事件/消息传递系统来允许容器有效地轮询/监视所包含对象中的状态更改。
答案 4 :(得分:-1)
别。容器类的职责是包含东西,没有别的东西。如果您需要容器类根据其中包含的内容执行操作,请让第三个对象执行这些操作。例如,我假设你正在根据类的内容重新安排或修改类的集合。而不是尝试在包含的类中执行此操作,而是在使用容器作为依赖项的类中执行此操作。