繁体   English   中英

解决循环依赖性

[英]Resolving circular dependancy

前提是:我正在制作一个粒子系统。 我有一个ParticleManager,它有一个ParticleSystem对象的向量,它有一个Particle类型的向量。 但是,我也有类Snowball,它继承自Particle,它有一个自己的ParticleSystem,因为它留下了一串粒子。

#pragma once
#include "ParticleSystem.h"

class Snowball : public Particle
{
private:
    ParticleSystem ps;
public:
    Snowball(){};
    Snowball(Point2D pos, RECT* viewport);
    void Update();
    void Draw(GraphicsM * pGraphicsModule);
};

这是Snowball.h文件,而ParticleSystem在顶部只有#include“Snowball.h”,并且整个使用Snowball,因为任何给定的粒子都可以是Snowball。 如何通过更改体系结构或代码顺序来解决这个问题?

一个选项:不是给Snowball一个粒子类型的成员,而是给它一个指向ParticleSystem的指针(最好是一个shared_ptr或unique_ptr来排除内存泄漏)。 那么你不需要在Snowball.h中#include ParticleSystem.h; 你只需要向前宣布它。 然后,Snowball的构造函数需要移动到.cpp文件并在那里实例化一个新的ParticleSystem以存储在指针中。

就像是:

 // Snowball.h
 class ParticleSystem;

 class Snowball
 {
 private:
    std::shared_ptr<ParticleSystem> ps;

 public:
    Snowball();
    // rest the same
};

// Snowball.cpp

#include "Snowball.h"
#include "ParticleSystem.h"

SnowBall::SnowBall()
   : ps(std::make_shared<ParticleSystem>())
{
}

// rest the same except for ps. becoming ps->

如果您需要多个使用彼此作为完整类型的类,您可以使用以下内容:

class TestClass1;
class TestClass2;


class TestClass1
{
    int val;
    TestClass2 foo();
};
class TestClass2
{
    int val;
    TestClass1 foo();
};


TestClass2 TestClass1::foo()
{
    /* ... */
}
TestClass1 TestClass2::foo()
{
    /* ... */
}

其他答案提供了如何解决问题的良好证明。 但是,您是否考虑过重构代码以免这样做? 通常,循环依赖性将在以后引起其他问题。

另一种结构是你可以使用组合而不是继承

圆形依赖性来自使用粒子的粒子系统,但粒子也使用粒子系统。 这是因为雪球是一个粒子。

相反,您可以让您的雪球包含粒子的实例和粒子系统的实例。 当你用粒子和粒子系统组成你的雪球时,这称为组合。

这种方式粒子依赖于粒子系统,雪球取决于两者,因此没有循环依赖。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM