c++ - 如何避免实体和映射之间的循环依赖?

标签 c++ oop circular-dependency

假设有两个类:MapEntity。 map 有一个指向游戏中所有实体的指针数组,实体使用 map 来检查他要去的地方是否有空位。因此,在主函数中,我正在执行以下操作:

map->getEntity(x, y)->walk(map)

这会导致实体和 map 之间的循环依赖。我尝试将实体的行走逻辑移至 Map 类,但它导致了许多其他问题,而且在我看来不太正确,因为我想将所有逻辑封装在一个entity.walk()方法中(检查是否目标字段可由实体访问,是否为空等),因此在移动实体之前我不需要在主函数中检查所有这些。我也尝试使用前向声明,但在这种情况下它无济于事,因为 map 和实体都在使用彼此的方法,而这些方法尚未声明。这是我现在拥有的:

class Entity;
class Map {
public:
    void add(Entity* ent) {
        ent->getX()                       //Map.h
        //...
    }
}
#include "Map.h"
class Entity {
     void walk(Map* map) {
         if(map->isEmpty(x, y)) {
             //...                        //Entity.h
         }
     }
}

最佳答案

头文件中只有一个方法声明,仅此而已。简单地不要定义内联方法:

class Entity;

class Map {
public:
    void add(Entity* ent);
}

然后在您的 map.cpp 文件中包含两个 header ,并定义方法:

void Map::add(Entity* ent) {
    ent->getX()
}

map.cpp #include 首先是两个头文件,这变成了一个无意义的大汉堡。使用类似的解决方案,结合 MapEntity 的方法来解决它们的循环依赖关系。

关于c++ - 如何避免实体和映射之间的循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67153159/

相关文章:

c++ - Qt 似乎使用了很多线程

c++ - 当基类私有(private)派生时,编译器插入的 vptr 是否变为私有(private)?

web-services - 编码架构问题

c# - 如何解决 Autofac 循环依赖?

C++ 循环包含内部结构

c++ - C++类中的静态动态二维数组

c++ - 为什么我的输出流段错误并且我的虚拟析构函数不起作用但是当我杀死虚拟时它会起作用

Java 面向对象编程对象范围

java - 如何设计一个名为过敏的类?

c# - 为什么 C# 中的类没有循环布局问题?