gpt4 book ai didi

c++ - 命名空间和类成员

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:59:45 25 4
gpt4 key购买 nike

考虑:

#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

最佳答案

除非必要,否则您应该尽量避免让 header 包含其他 header 。在这种情况下,您可以在第一个 header 中放置前向声明。

namespace t {
namespace graphics {
class Animation;
}

// continue with definitions
}

您的 header 可能以错误的顺序包含在某处。也许某些动画包括需要枚举,所以包括您的实体 header 。

我建议将该枚举移动到另一个 header 。如果它在类的本地,则将其放在类范围内。

顺便说一句,我还会:

  • 将那些 shared_ptr typedef 移动到另一个只有前向声明的 header 。任何想要使用这些 typedef 的人都不一定需要包括类的完整定义,特别是在头文件中使用它们的地方。

  • 使您的代码常量正确。

关于c++ - 命名空间和类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4145236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com