Пространства имен и члены класса - PullRequest
2 голосов
/ 10 ноября 2010

Рассмотрим:

#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

1 Ответ

2 голосов
/ 10 ноября 2010

Вы должны стараться избегать включения заголовков в другие заголовки, если они не нужны. В этом случае вы можете поместить предварительную декларацию в первый заголовок.

namespace t {
   namespace graphics {
       class Animation;
   }

   // continue with definitions
}

Существует вероятность того, что ваши заголовки включены где-то в неправильном порядке. Может быть, что-то, что включает в себя Animation, требует перечисления, так же как и заголовок вашей сущности.

Я бы предложил перенести это перечисление в другой заголовок. Если это локально для класса, поместите его в область видимости класса.

В сторону я бы также:

  • Переместите эти typedefs shared_ptr в другой заголовок, который имеет только прямые объявления. Любой, кто хочет использовать эти typedef, не обязательно должен включать полное определение класса, особенно в тех случаях, когда они используются в заголовочном файле.

  • Сделайте ваш код корректным.

...