循环依赖c ++因前向解除而失败

时间:2017-04-07 06:46:50

标签: c++ circular-dependency

我有两个课程,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_;
    };

我无法理解为什么我在这里获得循环依赖。当我阅读其他帖子时,似乎是这样做的方式。 有人可以向我解释一下我做错了吗?

更新:问题似乎是由于使用了相反的类存储库。为了说明,请参见此图。

我怎样才能解决这种依赖性呢?

Dependencies

1 个答案:

答案 0 :(得分:1)

您需要学习一个重要的原则,那就是接口。

我的想法是,当我想要使用你的某个类时,我想要知道的只是该类所做的。我不需要知道的是 它是如何做到的,也就是实现细节。

这就是为什么C ++将文件分成头文件和源文件的原因之一。头文件应包含它的功能,源文件的完成方式。人们甚至可以争论一种新格式,其中头文件只包含公共声明(即没有私有成员变量,私有辅助方法等)。

使用这将有助于您的事业。我乍看之下并没有看到任何有问题的行,但可能是IterationRepo包括迭代包括Set包括IterationRepo。

接口如何帮助你:在标题中,只声明,不要实现任何东西(有些用单行做,但我建议不要这样做)。仅向前声明。包含在源文件中。你不能以这种方式拥有循环依赖。

(当然,对于成员变量类型,规则被破坏 - 如果A有一个成员变量B,它需要知道B是什么才能知道它的大小,因此它需要包含它标题。)