[STL] Problem bei List



  • Moin,

    wenn ich in einer Klasse eine int-Liste deklariere und dann versuche in einer öffentlichen Methode ein Element zu dieser Liste hinzu zufügen,bekomme ich einen Ausnahmefehler ( Zugriffsfehler-Leseposition an der Adresse xxxx )

    class MeineKlasse{

    public :
    MeineKlasse();
    void Methode1();

    std::list <int> intlist;

    }

    void MeineKlasse::Methode1()
    {
    int x=3;
    intlist.push_back(x); <== Da gibt es dann den Ausnahmefehler
    }

    Wenn ich jedoch in der Methode1 die Liste dort deklariere, dann geht es. Allerdings ist sie dann nur in der Methode sichtbar, außerhalb nicht.

    Mache ich was falsch ?

    Gruss Bodo



  • Sieht korrekt aus. Vermutlich liegt dein Problem woanders.



  • mmh

    kann das eventuell am Compiler liegen ( Visual Studio . Net ) ? Darf man hier den Qellcode posten ? Evtuell einen Aussschnitt ? Denn ich finde nicht das Problem.

    Gruss Bodo



  • Klar kannst du den Code posten.
    Bitte nur das was relevant ist. (Sofern du das genau weisst) 😉
    Und in JEDEM Fall Code-Tags verwenden.



  • ok hier ist der Code 🙂

    Definition der Klasse CStudent:

    class CStudent:public CPerson{
    public :
    	CStudent(CKenntnis & wissen,CString initMatrikelnummer="00000");
    	CKenntnis & hatKenntnis;
    
    	CString Matrikelnummer;
    	std::list <CKenntnis*> myKenntnisse;
    };
    

    Definition der Klasse CCaseLab:

    class CCaseLabDoc 
    {
    
    public:
    
      CCaseLab();
    
    	[..]
    	void AddStudent(CString name,CString matrikelnummer);
    
    	[..]
    
    	std::list<CStudent*> m_studlist;
    	std::list<CKenntnis*> m_kenntnislist;
    	std::list<CThema*> m_themalist;
    
    };
    

    Implementierung von CCaseLab ::AddStudent

    void CCaseLabDoc::AddStudent(CString name,CString matrikelnummer)
    {
    
    	std::list<CStudent*>::iterator it;
    	CKenntnis kentnisse;
    	CStudent *Student = new CStudent(kentnisse,matrikelnummer);
             Student->Name=name;
    	m_studlist.push_back(Student);
    
    }
    

    Das ganze Projekt soll eine MFC Gui werden, wo man Studenten, Arbeiten und Themen eingeben kann. Das komische an der Sache ist, das ich auch eine Konsolenanwendung schreiben musste, und da ist der Quellcode eigentlich identisch - und da klappt es wie am Schnürrchen.

    Sobald er die Anweisung m_studlist.push_back(Student) ausführt, gibt es einen Ausnahmefehler.Im Überwachungsfenster ist die Grösse der Variable m_studlist.size = "??" (undefiniert )



  • Wie sieht denn der Konstruktor von CStudent aus?



  • Konstruktor CStudent:

    CStudent::CStudent(CKenntnis &wissen,CString initMatrikelnummer)
    :hatKenntnis(wissen),Matrikelnummer(initMatrikelnummer){};
    

    Konstruktor CKenntnis :

    CKenntnis::CKenntnis(CString initWissen){
    wissen=initWissen;
    };
    

    Gruss Bodo



  • Ja, also einen Fehler habe ich gefunden, aber anscheinend gibt es mehrere...(aufgrund des eigenartigen Designs der Klassen)

    Im Konstruktor von CStudent verwendest du eine Referenz auf CKenntnis.
    Diese Referenz wird in der Klasse weiterhin als Referenz gespeichert (also intern eine Speicheradresse).
    In der Funktion AddStudent übergibt du dann eine lokale Variable "kenntnisse" an CStudent, d.h. am Ende der Funktion wird diese Variable gelöscht und as gibt dann Speicherfehler beim Zugriff.

    Also speichere in CStudent intern das Objekt "CKenntnis" und übergib eine "const CKennnis &" an den Konstruktor:

    CStudent::CStudent(const CKenntnis &wissen,CString initMatrikelnummer)
      :hatKenntnis(wissen), Matrikelnummer(initMatrikelnummer)
    {};
    


  • Hallo,
    Die Referenz auf CKenntnis habe deshalb gemacht, weil die Klasse CStudent eine Komposition hat, die auf CKenntnisse verweisst. Ein teil des Klassendiagramms habe ich hochgeladen

    http://www.people.freenet.de/bvthadden/snap.jpg

    Probweise habe ich mal die Referenz aus CStudent entfernt.

    class CStudent:public CPerson{
    public :
    	CStudent(CString initMatrikelnummer="0000000");
    
    	CString Matrikelnummer;
    	std::list <CKenntnis*> myKenntnisse;
    };
    

    dann habe ich noch kurz den Konstruktor geändert:

    CStudent::CStudent(CString initMatrikelnummer)
    {
    Matrikelnummer=initMatrikelnummer;
    }
    

    und dann noch die Methode AddStudent angepasst.

    void CCaseLabDoc::AddStudent(CString name,CString matrikelnummer)
    {
    
    	std::list<CStudent*>::iterator it;
    	CStudent *Student = new CStudent(matrikelnummer);
             Student->Name=name;
    	m_studlist.push_back(Student);
    
    }
    

    Es gibt dann immer noch einen Ausnahmefehler ( Lesefehler an der Adresse xxxx )
    Visual C++ verweisst dann auf die Implementation von list.cpp

    iterator end()
    		{	// return iterator for end of mutable sequence
    		return (iterator(_Myhead));
    		}
    

    Ich habe irgendwie das Gefühl das er auf die Varibale std::list<CStudent*> von der Methode nicht zugreifen kann, wenn sie in dem public Teil der Klasse deklariert wird.

    Wenn ich sie jedoch erst in Addstudent(...) deklariere, dann gibt es keine Probleme.Die Variable ist dann aber nicht ausserhalb gültig, oder ?

    Gruss Bodo


Anmelden zum Antworten