多个类在多个头文件中相互引用

时间:2014-04-10 09:41:45

标签: c++ class header-files

我的游戏有一个玩家类,它是一个玩家,由用户控制,它会使用武器。武器类位于不同的头文件中,但包含对播放器的引用,因此它可以告诉Player类它必须使用哪个动画。

现在我的问题: 似乎我在彼此参考时做错了。我在两个头文件中创建了一个前向decleration,但是我收到一个错误:“不允许不完整的类型”

我也得到"cannot convert from Player* const to Weapon"因为我使用了这个:m_weapon(Weapon(this)),这是一个解决问题的试用版。

我的档案:

Player.h

#ifndef PLAYER_H
#define PLAYER_H

#include "DrawableObject.h"
#include "PlayerState.h"

class Weapon;

class Player : public AnimatableObject
{
private:
    std::string m_name; //name of the player
    States::PlayerState m_state; //state of the player
    Weapon &m_weapon;
public:
    Player(std::string name): 
    AnimatableObject("../../Images/PlayerSheet.png",
    sf::Vector2i(64,64),sf::Vector2i(8,8)),
    m_name(name),
    m_weapon(Weapon(this))
{
    m_updateTime = 100;
}

//Update the Player
virtual void Update() override;

};
#endif

Weapon.h

#ifndef WEAPON
#define WEAPON

#include "DrawableObject.h"

class Player;

class Weapon : AnimatableObject
{
protected:
float m_cooldown;
Player *m_user;
public:
Weapon(Player *user):m_cooldown(0.0f),
       m_user(user),
       AnimatableObject("",sf::Vector2i(0,0),sf::Vector2i(0,0))
    {}
Weapon(Player *user, float f):
       m_cooldown(f),
       AnimatableObject("",sf::Vector2i(0,0),sf::Vector2i(0,0)), 
       m_user(user)
    {}
virtual void Use(){} //Left Click/Trigger
virtual void AltUse(){} //Right Click/Trigger

};
#endif WEAPON

那么我如何引用彼此并处理头文件呢?

PS。我使用Visual Studio 2012,如果它有帮助

1 个答案:

答案 0 :(得分:2)

您的代码存在一些问题:

m_weapon(Weapon(this))

当你这样做时,你正在尝试构建一个新的Weapon对象。但是在这个阶段,它尚未定义(仅向前宣布)。尝试将构造函数的实现移动到您的.cpp文件中,其中包含Weapon.h文件。

Anothre问题是m_weapon是对Weapon对象的引用。当你执行m_weapon(Weapon(this))时,你正在尝试构建一个新对象,传递对它的引用并立即销毁它,因为它是一个临时对象。你不能这样做。

您可以做的是将m_weapon更改为指针并使用new Weapon(this)初始化它。然后你必须记住在Player的析构函数中销毁它。

在这种情况下,确定哪个对象拥有另一个对象非常重要。在这种情况下,玩家将拥有武器对象,管理它是有责任的(适当时删除)。