klasse wird nicht gefunden - ich bin ratlos!



  • Hallo zusammen,
    ich bin nun seit einigen Tagen damit beschaeftigt diesen daemlichen Bug aus meinem Code zu bekommen, leider ohne Erfolg. Ich verstehe absolut nicht was ich falsch mache und bin langsam echt ratlos.. Sollte also jemand von euch wissen wo der Haken ist bitte befreit mich aus meiner Verzweiflung...

    Ich habe derzeit eine Klasse FrameWork.h/.cpp die abstract ist. Davon abgeleitet gibt es die Klasse FrameWork_GUI.h/.cpp die die abstrakten Methoden definieren soll. Dazu hat die Klasse FrameWork einige Member-Variablen die das FrameWork in ihren Konstruktor uebergeben bekommen sollen (also z.B. ModelContainer mc = new ModelContainer(this) in FrameWork.cpp). Soweit so gut..

    Nun habe ich also in der Klasse ModelContainer sowie in FrameWork_GUI und allen anderen Klassen die FrameWork kennen sollten natuerlich den header auch included... dennoch scheint die Klasse FrameWork nicht gefunden zu werden..\

    Hier mein Code:

    FrameWork.h:

    #ifndef _framework_
    #define _framework_
    
    #include <string>
    #include <map>
    #include <iostream>
    #include <fstream>
    #include "FeatureVector.h"
    #include "ModelContainer.h"
    #include "FeatureExtraction.h"
    #include "HebbConnections.h"
    #include "ModelContainer.h"
    #include "ImageHandler.h"
    #include "./Fundamental/ConfigReader.h"
    #include "./ImageProcessing/Formation/YUVImage.h"
    #include "./Structures/TribotsException.h"
    #include "iGRLVQ.h"
    #include "PostProcessing.h"
    
    class FrameWork {
    	public:
    		void init();
    		virtual void output(int type, std::string) = 0;
    
    	private:
    		HebbConnections* hebb;
    		ModelContainer* models;
    		ModelContainer* trainData;
    		ModelContainer* testData;
    		FeatureExtraction* extractor;
    
    		ImageHandler* ih;
    		FeatureVector* extracted;
    		YUVImage* currentImage;
    		iGRLVQ* learner;
    
    		std::map<int, std::string> indexImageMap;
    };
    
    #endif /*_FrameWork_*/
    

    FrameWork.cpp:

    #include "FrameWork.h"
    
    void FrameWork::init() {
    	extractor = new FeatureExtraction(this);
    	hebb = new HebbConnections(this);
    	models = new ModelContainer(this);
    	trainData = new ModelContainer(this);
    	testData = new ModelContainer(this);
    	ih = new ImageHandler(this);
    	learner = new iGRLVQ(this,models,NULL);
    }
    

    und hier nun die FrameWork_GUI.h

    #ifndef _framework_gui_
    #define _framework_gui_
    
    #include <iostream>
    #include "FrameWork.h"
    
    class FrameWork_GUI : public FrameWork {
    	void output(int type, std::string);
    };
    
    #endif /*_FrameWork_GUI_*/
    

    und die .cpp von FrameWork_GUI (stark vereinfacht):

    #include "FrameWork_GUI.h"
    
    void FrameWork_GUI::output(int type, std::string str) {
    	std::cout << "test";
    }
    

    So und hier geht es schon los dass ich den Compilerfehler bekomme:

    FrameWork_GUI.h:12: error: expected class-name before ‘{’ token
    ModelContainer.h:63: error: expected `)' before ‘*’ token
    ModelContainer.h:64: error: expected `)' before ‘*’ token
    ModelContainer.h:113: error: ISO C++ forbids declaration of ‘FrameWork’ with no type
    

    er erkennt also FrameWork ueberhaupt nicht als Klasse.. wie kommt es?
    Ausserdem haben alle anderen Klassen die FrameWork includen und verwenden Compilerfehler an jeder stelle wo sie verwendet werden...

    Ich bin ratlos und komme hier leider nicht weiter.. Kann mir evtl jemand helfen?

    PS: Koennte es ein problem seind ass ModelContainer FrameWork included und FrameWork wiederrum ModelContainer? An sich nicht oder? Ich habe ja ifndef,etc genutzt



  • Denke schon, dass das sein könnte.

    Probiers doch einfach aus und mach ne Vorwärtsdeklaration.

    MfG



  • also a la

    class FrameWork;

    in allen klassen die diese Klasse nutzen? Sollte das nciht auch ohne gehen?
    Was genau macht eigentlich so eine Vorwaertsdeklaration?

    Gruesse und Danke
    Tim



  • Es macht möglich dass Framework auf ModelContainer und ModelContainer auf Framework verweisen kann, und es sollte in beide Richtungen nicht ohne gehen. ifdef schützt Dich nur vor rekursiver Textersetzung (Endlosschleife beim Includen), es macht nicht dass der Compiler "rückwärts" compiliert.

    Eines von beiden wird nunmal zuerst includiert, und da kann der Compiler ohne Forward nicht wissen was danach noch kommt.



  • aah... danke!



  • Hallo zusammen,
    leider habe ich mich zu frueh gefreut. Das mit der forward-declaration hat zwar die Probleme geloest, die ich mit den kreis-includes hatte, aber die Klasse FrameWork_GUI findet FrameWork immernoch nicht.. Hier noch einmal die klassen:

    FrameWork.h:

    #ifndef _framework_
    #define _framework_
    
    #include <string>
    #include <map>
    #include <iostream>
    #include <fstream>
    #include "FeatureVector.h"
    #include "ModelContainer.h"
    #include "FeatureExtraction.h"
    #include "HebbConnections.h"
    #include "ModelContainer.h"
    #include "ImageHandler.h"
    #include "./Fundamental/ConfigReader.h"
    #include "./ImageProcessing/Formation/YUVImage.h"
    #include "./Structures/TribotsException.h"
    #include "iGRLVQ.h"
    #include "PostProcessing.h"
    
    class FrameWork {
        public:
            void init();
            virtual void output(int type, std::string) = 0;
    
        private:
            HebbConnections* hebb;
            ModelContainer* models;
            ModelContainer* trainData;
            ModelContainer* testData;
            FeatureExtraction* extractor;
    
            ImageHandler* ih;
            FeatureVector* extracted;
            YUVImage* currentImage;
            iGRLVQ* learner;
    
            std::map<int, std::string> indexImageMap;
    };
    
    #endif /*_FrameWork_*/
    

    FrameWork.cpp:

    #include "FrameWork.h"
    
    void FrameWork::init() {
        extractor = new FeatureExtraction(this);
        hebb = new HebbConnections(this);
        models = new ModelContainer(this);
        trainData = new ModelContainer(this);
        testData = new ModelContainer(this);
        ih = new ImageHandler(this);
        learner = new iGRLVQ(this,models,NULL);
    }
    C/C++ Code:
    #include "FrameWork.h"
    
    void FrameWork::init() {
    extractor = new FeatureExtraction(this);
    hebb = new HebbConnections(this);
    models = new ModelContainer(this);
    trainData = new ModelContainer(this);
    testData = new ModelContainer(this);
    ih = new ImageHandler(this);
    learner = new iGRLVQ(this,models,NULL);
    }
    

    und hier nun die FrameWork_GUI.h

    #ifndef _framework_gui_
    #define _framework_gui_
    
    #include <iostream>
    #include "FrameWork.h"
    
    class FrameWork_GUI : public FrameWork {
        void output(int type, std::string);
    };
    
    #endif /*_FrameWork_GUI_*/
    

    und die .cpp von FrameWork_GUI (stark vereinfacht):

    #include "FrameWork_GUI.h"
    
    void FrameWork_GUI::output(int type, std::string str) {
        std::cout << "test";
    }
    C/C++ Code:
    #include "FrameWork_GUI.h"
    
    void FrameWork_GUI::output(int type, std::string str) {
    std::cout << "test";
    }
    C/C++ Code:
    #include "FrameWork_GUI.h"
    
    void FrameWork_GUI::output(int type, std::string str) {
        std::cout << "test";
    }
    

    Der CompilerFehler ist immernoch

    FrameWork_GUI.h:12: error: expected class-name before ‘{’ token
    

    Vielen Dank fuer eure Muehen
    Tim



  • ok, da habe ich mich wohl stellenweise vercopy-und-pastet... sorry dass es nun etwas unuebersichtlicher ist..



  • OK, habe den Fehler gefunden, es war ein anderer include der im kreis gelaufen ist...


Anmelden zum Antworten