我相信我有一个循环依赖问题。我研究了其他答案,但不了解如何使用前向声明解决问题。
我有以下组成:
+------------------+
|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/