我有一个名为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中,我将从所有组成部分传递对整体的引用,因为部分是从整体构建的。
答案 0 :(得分:4)
在C ++中,解析器在解析文件时读取类名。如果它看到它不知道的类名,则会抛出错误。这意味着如果A类中有一个引用了B类的对象(即使在方法签名中),并且它还没有看到B类,它会抛出错误。因此,如果A类引用B而B类引用A,则您具有循环依赖性。解决方案是向前扩展 - 您可以在给出完整定义之前声明类将存在。这满足了解析器,只要它最终定义。
关于如何使用它们的Wiki参考http://en.wikipedia.org/wiki/Forward_declaration