奇怪的循环依赖问题

tri*_*ker 0 c++

所以我有2个类,子弹和船,它们相互依赖,因此循环包含.由于我将Ship的界面#included包含在Bullet的界面中,因此显而易见的决定是将子弹声明转发给Ship.

但是,当我第一次尝试这个时,我仍然遇到编译错误.我读了一下前向声明并意识到我正在使用Ship的一个方法构建一个Bullet,并且Bullet的默认构造函数是成员初始化的,这(并且我可能是错的)不起作用,因为前向类声明不允许Ship查看界面中的定义(即成员初始化).

所以我决定放弃成员init并在Bullet的实现文件中定义构造函数,但是我仍然遇到循环依赖的相同问题.

特别是消息是invalid use of undefined type struct Bullet.

我可以把Bullet和Ship的接口放在同一个文件中,但这是最后的手段.对此问题的任何帮助表示赞赏.谢谢.

这是发生错误的位置:

case SDLK_UP: // Fire
{
    Bullet(*this) fired_bullet; // Create bullet. Line where error occurs.
    fired_bullet.Move(); // Move bullet
    break;
}
Run Code Online (Sandbox Code Playgroud)

Bullet的默认构造函数接受触发项目符号的Ship的参数,该代码位于Ship方法中.

GMa*_*ckG 5

你要:

Bullet fired_bullet(*this);
Run Code Online (Sandbox Code Playgroud)

但你的耦合非常紧张.什么子弹需要从船上发货,什么船需要从子弹?

我认为子弹需要知道它来自哪艘船,因此敌人的子弹不会伤害敌人,反之亦然.也许你需要团队类型?

enum bullet_team
{
    bullet_player,
    bullet_enemy,
}
Run Code Online (Sandbox Code Playgroud)

而你的船只和敌人只会告诉子弹他们在哪个团队,而不是强迫子弹跟踪它来自哪里:

关于射击,也许制作一个BulletManager单身人士.告诉经理你要在X位置制作子弹,团队方向Y和属性Z,经理会为你处理.

BulletManager::reference().fire(getPosition(), bullet_player);
Run Code Online (Sandbox Code Playgroud)