c++ - 解决循环依赖

标签 c++ inheritance

前提是:我在做一个粒子系统。我有一个 ParticleManager,它有一个 ParticleSystem 对象的 vector ,它有一个 Particle 类型的 vector 。但是,我也有继承自 Particle 的 Snowball 类,它有自己的 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,因为任何给定的 Particle 都可以是 Snowball。如何通过更改架构或代码顺序来解决此问题?

最佳答案

一个选项:不是给 Snowball 一个 ParticleSystem 类型的成员,而是给它一个指向 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->

关于c++ - 解决循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23253014/

相关文章:

c++ - HTTP 流 : what realizations of Push Technology are available?

c++ - 当另一个成员存在另一个签名时,调用纯虚拟成员的正确方法是什么?

java - 修改 JAR 文件而不重建 JAR

java - 接口(interface)的循环继承

c++ - 在构造函数/解构函数的情况下,“对 vtable 的 undefined reference ”

c++ - VC++ 错误 : array instantiation with size from templated static const

c++ - Arduino C++,奇怪的数组行为

c++ - 在 C++ 中实例化模板类类型的对象

c++ - FFmpeg 使用 avcodec_decode_video2 解码原始缓冲区

c++ - 隐藏私有(private)重载虚函数?