OOP——让部分意识到它们的整体

OOP -- make parts aware of their whole

本文关键字:意识到 OOP      更新时间:2023-10-16

我有一个名为Session的单例类,看起来像:

class Session {
private:
Session() throw () {};
Session(const Session & copy) throw ();                // Not implemented.
Session & operator= (const Session & copy) throw();    // Not implemented.
public:
static Session & getInstance() throw ()
{
static bmd2::Session instance;
return instance;
}

会话由数据集组成,数据集由文件组成(为简单起见,代码中未显示)。

我们通常的用途是让一个外部客户端,如下所示,通过调用getInstance()对会话API进行操作。

+--------------------------------------------+
| Session                                    |
|--------------------------------------------|                    +--------------------------+
|   Session::getInstance(); <------+-----------------------------+| Client                   |
|   instance;                      |         |                    |--------------------------|
|                                  |         |                    |                          |
|   +------------------------------|-------+ |                    |                          |
|   | Dataset                      |       | |                    |                          |
|   |------------------------------|-------| |                    |                          |
|   |                              |       | |                    |                          |
|   |                              |       | |                    |                          |
|   |                              |       | |                    |                          |
|   |                              |       | |                    |                          |
|   |       +----------------------|-----+ | |                    +--------------------------+
|   |       | File                 |     | | |
|   |       |----------------------|-----| | |
|   |       |                      |     | | |
|   |       |                      |     | | |
|   |       |                      |     | | |
|   |       |                      |     | | |
|   |       |                      +     | | |
|   |       |                            | | |
|   |       |                            | | |
|   |       |                            | | |
|   |       |                            | | |
|   |       |                            | | |
|   |       +----------------------------+ | |
|   +--------------------------------------+ |
+--------------------------------------------+

我最近遇到了一个用例,我希望文件和数据集能够访问它们所在的会话实例,也如上面所示。

让File知道其父会话的最佳方法是什么?我的第一次尝试是在File.h中包含Session.h,但它似乎导致了循环依赖性问题(我在整个项目中都有未解决的符号)。我不知道为什么会这样——如果有人能根据提供的信息告诉我——我将非常感谢。不管怎样,我把#includeSession.h移到了File.cpp中,一切似乎都正常了。然而,从C++的角度来看,我仍然对这种情况感到模糊。在Java中,我会从所有组成的部分传递对整体的引用,因为这些部分是从整体构建的。

在C++中,解析器在解析文件时读取类名。如果它看到一个不知道的类名,就会抛出一个错误。这意味着,如果类A中引用了类B的对象(即使是在方法签名中),并且它还没有看到类B,它将抛出一个错误。因此,如果类A引用B,类B引用A,则存在循环依赖关系。解决方案是一个正向开发——在给出完整定义之前,可以声明一个类将存在。这满足了解析器,只要它最终被定义。

关于如何使用它们的Wiki参考http://en.wikipedia.org/wiki/Forward_declaration