我有两个课程,MeassurementIteration和Meassurementset。 meassurementIteration具有集合向量,集合具有指向迭代的指针。
Meassurementiteration
#pragma once
#include <vector>
#include "MeassurementSetRepo.h"
#include "MeassurementSet.h"
class MeassurementIteration
{
public:
MeassurementIteration(const int id, const long start, const long end, const bool active)
: id_(id)
, start_(start)
, end_(end)
, active_(active)
{}
MeassurementIteration();
~MeassurementIteration() = default;
std::vector<MeassurementSet>& getMeasurementSet()
{
/** Magic **/
return this->msSets_;
}
private:
const int id_;
const long start_;
long end_;
bool active_;
MeassurementSetRepo mssetRepo;
std::vector<MeassurementSet> msSets_;
};
Meassurementset
#pragma once
#include <string>
#include <memory>
#include "MeassurementIterationRepo.h"
class MeassurementIteration;
class MeassurementSet
{
public:
MeassurementSet(const int id, const std::string & way, const int it_id)
: id_(id)
, msWay_(way)
, MeassurementIteration_Id_(it_id)
{
msit_ = nullptr;
}
~MeassurementSet()
{
delete msit_;
}
MeassurementIteration& getMSIteration()
{
if (this->msit_ == nullptr)
{
/** Magic sets msit **/
}
return *msit_;
}
private:
int id_;
const std::string msWay_;
const int MeassurementIteration_Id_;
MeassurementIterationRepo msitRepo_;
MeassurementIteration * msit_;
};
我无法理解为什么我在这里获得循环依赖。当我阅读其他帖子时,似乎是这样做的方式。 有人可以向我解释一下我做错了吗?
更新:问题似乎是由于使用了相反的类存储库。为了说明,请参见此图。
我怎样才能解决这种依赖性呢?
答案 0 :(得分:1)
您需要学习一个重要的原则,那就是接口。
我的想法是,当我想要使用你的某个类时,我想要知道的只是该类所做的。我不需要知道的是 它是如何做到的,也就是实现细节。
这就是为什么C ++将文件分成头文件和源文件的原因之一。头文件应包含它的功能,源文件的完成方式。人们甚至可以争论一种新格式,其中头文件只包含公共声明(即没有私有成员变量,私有辅助方法等)。
使用这将有助于您的事业。我乍看之下并没有看到任何有问题的行,但可能是IterationRepo包括迭代包括Set包括IterationRepo。
接口如何帮助你:在标题中,只声明,不要实现任何东西(有些用单行做,但我建议不要这样做)。仅向前声明。包含在源文件中。你不能以这种方式拥有循环依赖。
(当然,对于成员变量类型,规则被破坏 - 如果A有一个成员变量B,它需要知道B是什么才能知道它的大小,因此它需要包含它标题。)