首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解循环依赖

解循环依赖
EN

Stack Overflow用户
提问于 2014-04-23 19:01:12
回答 3查看 72关注 0票数 0

前提是:我正在制造一个粒子系统。我有一个ParticleManager,它有一个ParticleSystem对象的向量,它有一个粒子类型的向量。然而,我也有一个类斯诺球,它继承了粒子,它有一个自己的ParticleSystem,因为它会留下一系列的粒子。

代码语言:javascript
复制
#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);
};

这是斯诺球.h文件,ParticleSystem one的顶部只有#include“斯诺球.h”,并且在整个过程中使用斯诺球,因为任何给定的粒子都可以是雪球。如何通过更改架构或代码顺序来解决这一问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-23 19:06:18

一种选择:不要给斯诺球一个ParticleSystem类型的成员,而是给它一个指向ParticleSystem的指针(最好是一个shared_ptr或unique_ptr,以防止内存泄漏)。然后,您就不需要在斯诺鲍尔中包含ParchineSystem.h;您只需要转发-声明它。然后,雪球的构造函数需要移动到.cpp文件,并在那里实例化一个新的ParticleSystem以存储在指针中。

类似于:

代码语言:javascript
复制
 // 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->
票数 2
EN

Stack Overflow用户

发布于 2014-04-23 19:11:27

在需要几个以完整类型相互使用的类时,可以使用如下所示:

代码语言:javascript
复制
class TestClass1;
class TestClass2;


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


TestClass2 TestClass1::foo()
{
    /* ... */
}
TestClass1 TestClass2::foo()
{
    /* ... */
}
票数 0
EN

Stack Overflow用户

发布于 2014-04-23 19:18:55

其他答案很好地说明了如何解决这个问题。但是,您是否考虑过对代码进行重构,因此没有必要这样做?通常,循环依赖关系将在稍后引起其他问题。

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

循环依赖来自粒子系统使用粒子,但粒子也使用粒子系统。这是因为雪球是一个粒子。

相反,你可以让你的雪球包含一个粒子的实例和一个粒子系统的实例。这就是所谓的合成,因为你是由一个粒子和一个粒子系统组成你的雪球。

这样,粒子依赖于粒子系统,雪球依赖于两者,因此不依赖于循环。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23253014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档