前提是:我正在制作一个粒子系统。我有一个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。如何通过更改体系结构或代码顺序来解决此问题?
答案 0 :(得分:2)
一个选项:不是给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->
答案 1 :(得分:0)
如果您需要多个使用彼此作为完整类型的类,您可以使用以下内容:
class TestClass1;
class TestClass2;
class TestClass1
{
int val;
TestClass2 foo();
};
class TestClass2
{
int val;
TestClass1 foo();
};
TestClass2 TestClass1::foo()
{
/* ... */
}
TestClass1 TestClass2::foo()
{
/* ... */
}
答案 2 :(得分:0)
其他答案可以很好地演示如何解决问题。但是,您是否考虑过重构代码以免这样做?通常,循环依赖关系会在以后引起其他问题。
另一种结构是您可以使用组合而不是继承。
圆形依赖性来自使用粒子的粒子系统,但粒子也使用粒子系统。这是因为雪球是一个粒子。
相反,你可以让你的雪球包含一个粒子的实例和一个粒子系统的实例。当你用粒子和粒子系统组成你的雪球时,这称为组合。
这样粒子依赖于粒子系统,雪球依赖于两者,因此没有循环依赖。