所以我有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方法中.
你要:
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)