Problem mit Kontruktor der eigene Methode aufruft



  • Hallo,

    ich habe 2 Klasen geschrieben: Modell und ah64Modell. ah64Modell erbt von Modell.
    (Diese Klassen sollen ein Objekt aus einer *.obj Datei laden, was auch funktioniert)

    #pragma once
    
    class Modell
    {
    protected: 
    
    	typedef struct			{
    
    		float x,		
    			y,		
    			z;		
    	} Koordinaten, Normale;
    
    public:
    	Modell(char *filename);								
         ~Modell();					
         virtual void darstellen(float zeit)=0;			
    
    	int getAnzahl_VertexKoordinaten();					
        int getAnzahl_TexturKoordinaten();
    	int getAnzahl_Normale();
    	int getAnzahl_Polygone(int modell);
    
    	int get_Last_Error();							
    	bool ObjectLoader(char *filename);		
             bool Erzeuge_List();
    
    };
    
    #include "Modell.h"
    
    #pragma once
    
    class ah64Modell :public Modell
    {
       float rotorstellung_oben;
       float rotorstellung_hinten;
    
    public:
       ah64Modell(char *filename);
       void darstellen(float zeit);
    
    };
    

    Nun habe ich ein komisches verhalten im Konstruktor der Klasse von der geerbt wird(Superklasse):

    Modell::Modell(char *filename)   			
    {
    	error=0;									
        displayList=0;
    	t.VertexKoordinatenCount=0;				 
    	t.TexturKoordinatenCount=0;	
    	t.NormaleCount=0;	
    	t.TeilmodelCount=0;
    	kuenstlich_erhoeht=false;
    	if (!ObjectLoader(filename) && error==0) {error=10;}
    	Erzeuge_List();                                       //Hier ist das Problem!!!!!!!!!!!
    }
    

    Ich rufe die Superklasse im Konstruktor der erbenden Klasse folgendermaßen auf:

    ah64Modell::ah64Modell(char *filename):Modell(filename)
    {
    	tex.LoadGLTextures(L"AH64 Textur.bmp");
    	rotorstellung_oben=0;
    	rotorstellung_hinten=0;
    }
    

    Das Problem ist nun, das im dem Konstruktor der Superklasse die letzte Zeile

    Erzeuge_List();
    

    einfach nicht angesprungen wird. Ich habe es mit dem Debugger getestet.
    Ich erzeuge die Objekte folgendermaßen:

    ah64Modell *m; 
    m = new ah64Modell("ah64.obj");
    

    Das komische ist, dass wenn ich die Methode Erzeuge_List() von außerhalb aufrufe, dann funktioniert alles wie es soll:

    ah64Modell *m; 
    m = new ah64Modell("ah64.obj");
    m->Erzeuge_List();
    

    Anmerkung: Jeder Aufruf einer eigenen Methode im Konstruktor der Superklasse funktioniert nicht richtig. Auch beim Aufruf von ObjectLoader wird Code einfach ignoriert (in der Methode, aber sie wird wenigstens angesprungen).
    Woran liegt das?



  • Also bei mir funktioniert das hier:

    class base{
    protected:
    	void foo (){std::cout << "base::foo" << std::endl;
    		bar ();	
    	}
    
    	void bar (){std::cout << "base::bar" << std::endl;}
    };
    
    class derived :public base{
    public:
    	derived (){
    		foo ();
    	}
    };
    };
    

    ...

    derived d;
    

    Problematisch sollten solche Sachen erst werden, wenn du virtual benutzt, aber da sehe ich (und dein Compiler) kein Problem.



  • Entweder hast du hier was falsch abgetippt/vereinfacht/... und der "böse" Code ist hier nichtmehr ersichtlich, oder aber der Fehler entsteht ganz woanders.
    Wenn du irgendwo Speicher überschreibst (z.B. mit memcpy aber auch gerne mit Arrayzugriffen mit zu grossem oder negativem Index) dann könnte das alles mögliche an seltsamem Verhalten bewirken.



  • Das Problem ist nun, das im dem Konstruktor der Superklasse die letzte Zeile

    Erzeuge_List();
    

    einfach nicht angesprungen wird. Ich habe es mit dem Debugger getestet.
    Ich erzeuge die Objekte folgendermaßen:

    Nun das Problerm könnte in dieser Zeile:

    if (!ObjectLoader(filename) && error==0) {error=10;}
    

    liegen was passiert im ObjectLoader.. gibts da drine ne exception etc.


Anmelden zum Antworten