OOP - 让零件了解整体

时间:2014-02-16 20:39:06

标签: c++ oop

我有一个名为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()让外部客户端(如下所示)对Session API起作用。

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

我最近遇到了一个用例,我希望File和Dataset能够访问它们所在的Session实例,如上所示。

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

1 个答案:

答案 0 :(得分:4)

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

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