考虑:
#ifndef __t__ENTITY_H
#define __t__ENTITY_H
#include "../graphics/animation.h"
namespace t {
namespace entity {
namespace type {
enum Enum { GFX = 0, SFX, PFX, AI, MAX };
}
//template <class T>
class Entity {
public:
Entity(unsigned int, unsigned int, unsigned int);
Entity();
~Entity();
int getPosX() { return m_posX; }
int getPosY() { return m_posY; }
void setPos(int x, int y) { m_posX = x; m_posY = y; }
//TODO: const references
unsigned int getGFXId() { return m_ids[type::GFX]; }
unsigned int getSFXId() { return m_ids[type::SFX]; }
unsigned int getPFXId() { return m_ids[type::PFX]; }
int update(const float);
int draw();
int fetchGraphics();
int fetchSound();
int fetchPhysics();
protected:
//TODO: friend class entity::Handler int reset()
private:
int updatePhysics(const float);
int updateGraphics(const float);
int updateSound(const float);
int m_posX, m_posY;
t::graphics::Animation* m_pAnimation;
float m_lastTime;
unsigned int m_ids[type::MAX];
}; // class Entity
typedef boost::shared_ptr<t::entity::Entity> SPENTITY;
typedef boost::shared_ptr<std::vector<SPENTITY> > SPENTITYS;
} // namespace entity
} // namespace t
#endif // __t__ENTITY_H
在该代码中成员“t :: graphics :: Animation * m_pAnimation;”给出“错误:'t :: graphics'尚未声明”,即使“../graphics/animation.h”看起来像:
#ifndef __t__ANIMATION_H
#define __t__ANIMATION_H
#include "frame.h"
namespace t {
namespace graphics {
class Animation {
public:
Animation();
Animation(SPFRAMES);
~Animation();
float getLastFrameChange() { return m_lastFrameChange; }
int getCurrentFrameId() { return m_currentFrameId; }
//SPFRAME getCurrentFrame() { return m_spFrames.get()[m_currentFrameId]; }//return m_spFrames[m_currentFrameId]; }
void setCurrentFrame(int val) { m_currentFrameId = val; }
int update(const float);
//int fetchDrawables();
protected:
private:
float m_lastFrameChange;
unsigned int m_currentFrameId;
unsigned int m_oldFrameId;
SPFRAMES m_spFrames;
}; // class Animation
typedef boost::shared_ptr<Animation> SPANIMATION;
typedef boost::shared_ptr<std::vector<SPANIMATION> > SPANIMATIONS;
} // namespace graphics
} // namespace t
#endif // __t__ANIMATION_H
答案 0 :(得分:2)
除非必要,否则您应该尽量避免使标题包含其他标题。在这种情况下,您可以在第一个标题中放入一个前向声明。
namespace t {
namespace graphics {
class Animation;
}
// continue with definitions
}
您的标题可能会以错误的顺序包含在某处。也许某些动画包含枚举的需求,包括你的实体标题。
我建议将该枚举移动到另一个标题。如果它是类的本地,则将它放在类范围内。
顺便说一下,我也会:
将这些shared_ptr typedef移动到只有前向声明的不同标头。任何想要使用这些typedef的人都不一定需要包含该类的完整定义,特别是它们在头文件中的使用位置。
使您的代码保持正确。