Announcement

Collapse
No announcement yet.

Verwendung des undefinierten Typs

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Verwendung des undefinierten Typs

    Hallo,

    ich habe folgende *.h Datei :

    Code:
    #ifndef _CompositorDemo_FrameListener_H_
    #define _CompositorDemo_FrameListener_H_
    
    #include <OgreFrameListener.h>
    #include <OIS.h>
    
    #include "ItemSelectorViewManager.h"
    
    //---------------------------------------------------------------------------
        
    //---------------------------------------------------------------------------
    class CompositorDemo;
    
    class CompositorDemo_FrameListener : Ogre::FrameListener, OIS::KeyListener,
            OIS::MouseListener, ItemSelectorInterface
        {
        #define MINSPEED .150f
        #define MOVESPEED 30
        #define MAXSPEED 1.800f
    
        protected:
    		Ogre::String mDebugText;
    
            CompositorDemo* mMain;
            Ogre::Vector3 mTranslateVector;
            bool mStatsOn;
            unsigned int mNumScreenShots;
            bool mWriteToFile;
            float mSkipCount;
            float mUpdateFreq;
            int mSceneDetailIndex;
            Ogre::TextureFilterOptions mFiltering;
            int mAniso;
            bool mQuit;
    
            float mMoveScale;
            float mRotScale;
            float mSpeed;
            float mAvgFrameTime;
            Ogre::Real mMoveSpeed;
            Ogre::Real mRotateSpeed;
            CEGUI::Point mLastMousePosition;
            bool mLastMousePositionSet;
            // just to stop toggles flipping too fast
            Ogre::Real mTimeUntilNextToggle ;
            float mRotX, mRotY;
            bool mProcessMovement;
            bool mUpdateMovement;
            bool mLMBDown;
            bool mRMBDown;
            bool mMoveFwd;
            bool mMoveBck;
            bool mMoveLeft;
            bool mMoveRight;
    		Ogre::SceneNode* mSpinny;
    
            ItemSelectorViewManager* mCompositorSelectorViewManager;
    
    		OIS::Mouse    *mMouse;
    		OIS::Keyboard *mKeyboard;
    		OIS::InputManager* mInputManager;
    
            CEGUI::Renderer* mGuiRenderer;
            CEGUI::Window* mGuiAvg;
            CEGUI::Window* mGuiCurr;
            CEGUI::Window* mGuiBest;
            CEGUI::Window* mGuiWorst;
            CEGUI::Window* mGuiTris;
            CEGUI::Window* mGuiDbg;
            CEGUI::Window* mRoot;
    		CEGUI::Listbox* mDebugRTTListbox;
    		CEGUI::Window* mDebugRTTStaticImage;
    		typedef Ogre::vector<CEGUI::Imageset*>::type ImageSetList;
    		ImageSetList mDebugRTTImageSets;
    
            CEGUI::MouseButton convertOISButtonToCegui(int ois_button_id);
            void CheckMovementKeys( CEGUI::Key::Scan keycode, bool state );
            void updateStats(void);
            void registerCompositors(void);
    		void initDebugRTTWindow(void);
    		void updateDebugRTTWindow(void);
    
        public:
            CompositorDemo_FrameListener(CompositorDemo* main);
            virtual ~CompositorDemo_FrameListener();
    		void setSpinningNode(Ogre::SceneNode* node) { mSpinny = node; }
    
        private:
            void connectEventHandlers(void);
    
    		virtual bool mouseMoved(const OIS::MouseEvent &e);
    		virtual bool mousePressed(const OIS::MouseEvent &e, OIS::MouseButtonID id);
            virtual bool mouseReleased(const OIS::MouseEvent &e, OIS::MouseButtonID id);
    
            virtual bool keyPressed(const OIS::KeyEvent &e);
            virtual bool keyReleased(const OIS::KeyEvent &e);
    
            // Event handlers
            bool frameRenderingQueued(const Ogre::FrameEvent& evt);
            bool handleMouseMove(const CEGUI::EventArgs& e);
            bool handleMouseButtonUp(const CEGUI::EventArgs& e);
            bool handleMouseButtonDown(const CEGUI::EventArgs& e);
            bool handleMouseWheelEvent(const CEGUI::EventArgs& e);
            bool handleKeyDownEvent(const CEGUI::EventArgs& e);
            bool handleKeyUpEvent(const CEGUI::EventArgs& e);
    		bool handleRttSelection(const CEGUI::EventArgs& e);
            void itemStateChanged(const size_t index, const bool state);
        };
    
    #endif
    Rufe ich in der zugehörigen *.cpp folgendes auf :

    Code:
    mMain->getRenderWindow()->getCustomAttribute("WINDOW", &windowHnd);
    kriege ich an der Stelle die Fehlermeldung : error C2027: Verwendung des undefinierten Typs "CompositorDemo"

    Habe schon einige Threads dazu gelesen, aber noch keine richtige Lösung finden können.Vlt kann jemand helfen?

  • #2
    Er findet wohl die Klasse CompositorDemo nicht. Du hast dem Compiler zwar gesagt, dass es sie irgendwo geben wird, aber bindest sie ev. nicht ein
    Christian

    Comment


    • #3
      Okay, wie binde ich die Klassen denn richtig ein? Ich dachte, wenn die Klasse in der Klasse CompositorDemo_FrameListener verwendet wird, ist sie durch
      Code:
      #include CompositorDemo_FrameListener.h
      in der *.cpp verfügbar und damit eingebunden?

      Comment


      • #4
        Das include steht da aber nicht
        Christian

        Comment


        • #5
          Das include steht ja in der *.cpp, Hätte ich mitposten sollen, aber ich dachte es liegt an der *.h

          Code:
          ...
          #include "CompositorDemo_FrameListener.h"
          ...
          CompositorDemo_FrameListener::CompositorDemo_FrameListener(CompositorDemo* main)
                  : mMain(main)
          ...
          {
          ...
          mMain->getRenderWindow()->getCustomAttribute("WINDOW", &windowHnd);
          ...
          }
          Das ist der (denke ich) relevante Code aus der *.cpp.

          Ich habe jetzt bereits einiges über Vorwärtsdeklaration gelesen, aber bin der Meinung, dass ich das ja auch so mache, wie es überall beschrieben ist. Muss ich eigentlich eine COmpoitorDemo.h haben?
          Zuletzt editiert von Chickaria; 28.02.2013, 10:30.

          Comment


          • #6
            Wozu brauchst du eine Vorwärtdeklaration? http://www.marquardtnet.info/cecke/q...quicky_22.html

            Ich sehe das nicht

            . Muss ich eigentlich eine COmpoitorDemo.h -> ja, wenn es eine Klasse ist

            Warum bindest du die benötigte *.h nicht in der obigen +.h ein
            Christian

            Comment


            • #7
              Ich dachte :

              Code:
              class CompositorDemo;
              
              class CompositorDemo_FrameListener {
                 CompositorDemo* mMain;
              }
              wäre so eine Vorwärtsdeklaration. Ich muss dazu sagen, dass ich den Code nicht selbst geschrieben habe. Daher habe ich auch keine CompositorDemo.h. Ich habe ja auch keine CompositorDemo.cpp

              Comment


              • #8
                Die ist doch nur erforderlich, wenn CompositorDemo seinerseits nun CompositorDemo_Framelistener benutzt. Siehe Link. A benutzt B. B benutzt A Also solltest du die *.h normal einbinden
                Christian

                Comment


                • #9
                  Ich habe aktuell gar keine CompostirDemo.h stelle ich gerade fest. Das ja merkwürdig...Kann es denn überhaupt so laufen ohne *.h? Sonst muss ich die erst erstellen und dann einbinden.

                  Comment


                  • #10
                    Es kann ja sein (auch wenn das das Wiederfinden und damit die Wartung erschwert), dass die Klasse CompositerDemo zusammen mit einer anderen Klasse in derselben .h definiert ist. Manche empfinden das als schlechten Stil, aber es gibt viele, die machen das, wenn entsprechende Klassen sehr eng zusammenarbeiten. Da Du ja sagst, dass Du das nicht geschrieben hast, halte ich das für durchaus wahrscheinlich.

                    Comment


                    • #11
                      Das scheint sie doch auch zu sein, nämlich in der CompositorDemo_FrameListener.h mit der class CompositorDemo_FrameListener. Oder sehe ich das falsch?

                      Comment


                      • #12
                        Dir fehlt aber eine CompostirDemo.h
                        Christian

                        Comment


                        • #13
                          Das stimmt wohl. Dann lagere ich das mal einfach aus. Keine Ahnung warum der Code so gegeben war. Muss doch eigentlich mal funktioniert haben bei dem Ersteller, denke ich.

                          Comment

                          Working...
                          X