Der Ausdruck muss einen Klassentyp aufweisen



  • hi!

    ich hab hier im forum schon geschaut aber bisher konnte ich den fehler noch nicht beheben.

    Ich versuch den code mal auf das wesentliche reduziert wiederzugeben:

    // .h file und .cpp file von Hexapod
    class hexapod
    {
    	public:
    		hexapod();
    		~hexapod();
    		leg*				bein[6];	
    };
    hexapod :: hexapod()
    {
    	bein[0] = new leg();
    }
    
    // .h file von leg
    class leg : public  hexapod 
    {
    	public:
    		leg();
    		~leg();
    		void				draw_leg();
    };
    
    // Hauptprogramm:
    //hexapod* hexa = new hexapod();
    hexapod hexa(); // diese version verursacht den gleichen fehler
    
    while(TRUE){
           render frame(hexa);
    }
    
    // Funktion render_frame
        void render_frame(hexapod hexa)
        {
    		hexa.bein[0].draw_leg();
        }
    

    zeile 35 "hexa.bein.draw_leg();" wirft jetzt den fehler
    "der ausdruck muss einen klassentyp aufweisen" aus.
    eigentlich müsste das doch so machbar sein oder?

    ich möchte später dem objekt hexa 6 beine zuweisen, und dann so einen satz schreiben können: hexa.bein[1].draw_leg();
    mach ich dafür den falschen ansatz?



  • Schön wäre, wenn der reduzierte Code noch in sich stimmig wäre und nicht lauter Abweichungen (mal bein, mal m_bein, ...) und Syntaxfehler enthalten würde.

    Das Problem hier ist aber, dass hexa.bein ein Zeiger ist. Den musst Du dereferenzieren. Also (wenn dort später sowieso ein Array liegt) am besten gleich hexa.bein[0].draw_leg().



  • cl90 schrieb:

    Ich versuch den code mal auf das wesentliche reduziert wiederzugeben:

    Der Versuch ist dir gründlich missglückt. Das lässt sich beim besten Willen nichtmal ansatzweise compilieren, z.B. hast du unten einzelne Zeilen lose zwischen den Funktionen stehen. Außerdem bezeichnest du etwas als Schleife, was eine Funktion ist - von einer Schleife ist nichts zu sehen.

    Was mir auffällt: du hast unten zwei Variablen stehen, die den gleichen Namen haben. Die eine ist ein Pointer, die andere nicht. Wie nah die im Code zusammenstehen kann man aus den Fetzen, die du uns hier präsentierst, nicht erkennen, aber die Fehlermeldung klingt so, als ob der Compiler bei "hexa.bein" glaubt, dass du mit "hexa" den Pointer meinst, und dann macht der .-Operator keinen Sinn, weil er eben nur auf Ausdrücke von Klassentypen angewendet werden kann.



  • ja.. war etwas schwierig... dazwischen waren rund 300 zeilen code.
    hier nochmal überarbeitet:

    // .h file und .cpp file von Hexapod
    class hexapod
    {
    	public:
    		hexapod();
    		~hexapod();
    		leg*				bein[6];	
    };
    hexapod :: hexapod()
    {
    	bein[0] = new leg();
    }
    
    // .h file von leg
    class leg : public  hexapod 
    {
    	public:
    		leg();
    		~leg();
    		void				draw_leg();
    };
    
    // Hauptprogramm:
    //hexapod* hexa = new hexapod();
    hexapod hexa(); // diese version verursacht den gleichen fehler
    
    while(TRUE){
           render frame(hexa);
    }
    
    // Funktion render_frame
        void render_frame(hexapod hexa)
        {
    		hexa.bein[0].draw_leg();
        }
    


  • cl90 schrieb:

    hexapod hexa(); // diese version verursacht den gleichen fehler[/cpp]

    Was soll das eigentlich sein? Eine Funktionsdeklaration, die als Rückgabewert ein Objekt deiner Hexapod-Klasse hat?

    Ansonsten ist das immer noch kein kompilierbarer Code. Noch eine Kleinigkeit: anstatt deiner selbstgebastelten TRUE-Konstante, kannst du auch einfach true/false nutzen, die in C++ Teil der Sprache sind.



  • Lies dir mal bitte den Link in meiner Signatur durch. Und mach dir dann die Mühe, die Hinweise von LordJaxom und mir zu verstehen und zu beheben, und wenn du dann noch immer Probleme hast, poste bitte Code, mit dem wir auch was anfangen können. Wenn dir daran liegt, eine Antwort zu kriegen, die nicht ins Blaue geraten ist.



  • Warum...

    TRUE
    

    anstatt

    true
    

    ?

    leg*                bein[6];
    

    ein Array aus Zeigern und dann der Aufruf

    hexa.bein[0].draw_leg();
    

    anstatt

    hexa.bein[0]->draw_leg();
    

    ?

    render frame(hexa);
    

    das Leerzeichen?

    hexapod hexa();
    

    diese Funktion und wieso zur Hölle greifst du mit

    hexa.bein[0].draw_leg();
    

    auf den Funktions(zeiger)(?) zu?

    Wird zwar zu oft gesagt, aber da hilft nur ein gutes Grundlagenbuch!



  • danke für die die wirklich versucht haben zu helfen.
    die leute die nur doofe kommentare gegeben haben, wirklich unnötig.
    ja es war ein Grundlagenproblem. aber wenn man sich nicht die ganze zeit auf grundlagen niveau bewegt kann es schonmal passieren das man da etwas vergisst.
    es war nur ein falscher pointer auffruf.

    es lohnt auch nicht jetzt groß zu erklären oder zu diskutieren. ich sag einfach mal close.


Anmelden zum Antworten