我相信我有一个循环依赖问题。我研究了其他答案,但不了解如何使用前向声明解决问题。

我有以下组成:

+------------------+
|Session  <---------------+
|                  |      |
|  +------------+  | Must know
|  |Dataset     |  |   about
|  |            |  |      ^
|  |            |  |      |
|  |            +---------+
|  |            |  |
|  |            |  |
|  +------------+  |
|                  |
+------------------+


从下面发布的代码中,您可以发现任何循环依赖项或问题吗?如果需要,我可以发布更多代码。这是一个复杂的系统,我试图将问题归结为最基本的部分。

会话h

#include "Dataset.h"

...

namespace bmd2 {

class Session {

  private:
    std::vector<std::shared_ptr<bmd2::Dataset>>
        datasetContainer;  // error here


数据集

#include "Session.h"  // when I include this line I get strange errors

namespace bmd2 {

class Dataset {

  private:
    bmd::Session & session;


使数据集了解Session时遇到的一些错误是:

Session.h Dataset in namespace bmd2 does not name a type

第一次尝试

所以我尝试了这个:

数据集

// removed include
namespace bmd2 {

class Dataset {

  class Session;

  private:
    bmd2::Session & session;


数据集

#include "Session.h"

bmd2::Dataset::Dataset(bmd2::Session & _session,
                       bmd2::Logger & _logger,
                       const std::string & filePath,
                       bmd2::File::FileMode fileMode)
                       : session(_session), logger(_logger)
{


我仍然得到:名称空间bmd2中的'Session'没有命名类型,这太令人沮丧了。

最佳答案

确实,您不能同时包含两个标头。幸运的是,Dataset不需要仅仅声明Session的完整定义就可以声明对它的引用。只需声明类(在其名称空间内):

class Session;


确保它在名称空间中;您的更新表明您已将其放在Dataset中,该声明在不同范围内声明了另一个类。

关于c++ - 这是循环依赖吗?我该如何解决?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21980279/

10-12 04:22