Probleme mit list



  • Hallo!
    Ich habe vor kurzem begonnen mich mit STL zu beschäftigen. Und wollte damit nun einwenig rumspielen.
    Nun bin ich heute auf folgendes Problem gestoßen.
    Ich will die Objekte "Teilchen" mit einer Liste verwalten.
    Solange ich nur ein "Teilchen" in der Liste habe funktioniert es noch, aber sobald ich mehrere "Teilchen" drin habe, erhalte ich sehr merkwürdige ausgaben.
    Mit folgendem Code will ich die Liste beschreiben.

    int masse = rand();
    int ladung = 1;
    
    Vektor * ort;
    ort = new Vektor(1,1,1);
    Vektor * v1;
    v1 = new Vektor(pi*1,pi*1,0);
    cout << "Vektor 1: ";
    v1->get_Vek();
    cout << "ort 1: ";
    ort->get_Vek();
    Teilchen_list.push_back(Teilchen(masse,ladung, ort, v1));
    
    masse = rand();
    Vektor * ort2;
    ort2 = new Vektor(2,2,2);
    Vektor * v2;
    v2 = new Vektor(pi*2,pi*2,0);
    cout << "Vektor 2: ";
    v2->get_Vek();
    cout << "ort 2: ";
    ort2->get_Vek();
    Teilchen_list.push_back(Teilchen(masse,ladung, ort2, v2));
    
    delete ort2;
    delete v2;
    delete ort;
    delete v1;
    

    Ich erhalte als Ausgabe:

    Vektor 1: Vektor: (3.14159,3.14159,0)
    ort 1: Vektor: (1,1,1)
    Vektor 2: Vektor: (6.28319,6.28319,0)
    ort 2: Vektor: (2,2,2)
    ---
    Teilchen Position: Vektor: (6.28319,6.28319,0)
    Teilchen Geschwindigkeit: Vektor: (2,2,2)
    Teilchen Masse: 1173233298
    ---
    Teilchen Position: Vektor: (2,2,2)
    Teilchen Geschwindigkeit: Vektor: (6.28319,6.28319,0)
    Teilchen Masse: 1270404533

    Irgendwie hat er Probleme mit dem ort und v1.
    Mein Objekt "Teilchen" hat folgende Größen:
    int masse;
    int ladung;
    Vektor * ort;
    Vektor * geschw;

    Kann mir jemand sagen, was ich falsch gemacht habe?
    Vielen Dank im voraus!



  • Schau mal in Zeile 29 deines Quellcode-Listings. Da sollte dir was auffallen.



  • sry, sehe nichts, da ist die funktion zu ende
    was habe ich übersehn?



  • solarwind schrieb:

    Kann mir jemand sagen, was ich falsch gemacht habe?

    Jein. Deine Frage ist zu schwammig. Weiters wäre es gut, wenn Du Dein Problem auf ein Minimalbeispiel reduziert hättest (compilierbar) bei dem der Fehler auftritt und dazu eine Fehlerbeschreibung, die es offensichtlich macht, was du als Fehler ansiehst.

    Dein Problem ist wahrscheinlich (Glaskugelmode ein ;)), dass du Pointer verwendest, wo sie nicht wirklich nötig sind und den copy-ctor von Teilchen nicht oder nicht richtig implementiert hast.

    Hier mal ein Beispiel zum rumspielen:

    #include <ctime> /* time( ) */
    #include <cstdlib> /* rand( ) */
    
    #define _USE_MATH_DEFINES /* Nicht Standard C++ */
    #include <cmath> /* M_PI */
    
    #include <list> /* std::list */
    #include <iostream>
    
    template< typename T >
    class vector_r3_t {
    
    	private:
    		T m_x, m_y, m_z;
    
    	public:
    		const T &x, &y, &z;
    
    		vector_r3_t( ) : m_x( ), m_y( ), m_z( ), x( m_x ), y( m_y ), z( m_z ) { }
    		vector_r3_t( T x, T y, T z ) : m_x( x ), m_y( y ), m_z( z ), x( m_x ), y( m_y ), z( m_z ) { }
    };
    
    template< typename T >
    std::ostream& operator<<( std::ostream &output_stream, const vector_r3_t< T > &object ) {
    
    	return output_stream << "Vector: [ " << object.x << " | " << object.y << " | " << object.z << " ]";
    }
    
    template< typename T >
    class particle_t {
    
    	public:
    		typedef T vector_t;
    
    	private:
    		double m_mass;
    		bool m_charge;
    		T m_position, m_heading;
    
    	public:
    		const double &mass;
    		const bool &charge;
    		const T &position, &heading;
    
    		particle_t( ) :
    			m_mass( ), m_charge( ), m_position( ), m_heading( ),
    			mass( m_mass ), charge( m_charge ), position( m_position ), heading( m_heading )
    		{ }
    
    		particle_t( double mass, bool charge, const T &position, const T &heading ) :
    			m_mass( mass ), m_charge( charge ), m_position( position ), m_heading( heading ),
    			mass( m_mass ), charge( m_charge ), position( m_position ), heading( m_heading ) { }
    };
    
    template< typename T >
    std::ostream& operator<<( std::ostream &output_stream, const particle_t< T > &object ) {
    
    	output_stream << "Mass: " << object.mass << "\nPolarity: " << ( object.charge ? "positive\n" : "negative\n" );
    	return output_stream << "Position " << object.position << "\nHeading " << object.heading;
    }
    
    int main( ) {
    
    	typedef particle_t< vector_r3_t< double > > particle_r3_t;
    	typedef std::list< particle_r3_t > particle_r3_list_t;
    
    	particle_r3_list_t particle_list;
    
        std::srand( static_cast< unsigned int >( std::time( 0 ) ) );
    
    	particle_list.push_back( particle_r3_t( std::rand( ), true, particle_r3_t::vector_t( 1, 1, 1 ), particle_r3_t::vector_t( M_PI, M_PI, 0 ) ) );
    	particle_list.push_back( particle_r3_t( std::rand( ), true, particle_r3_t::vector_t( 2, 2, 2 ), particle_r3_t::vector_t( M_PI * 2, M_PI * 2, 0 ) ) );
    	particle_list.push_back( particle_r3_t( std::rand( ), true, particle_r3_t::vector_t( 3, 3, 3 ), particle_r3_t::vector_t( M_PI * 3, M_PI * 3, 0 ) ) );
    
    	while( particle_list.size( ) ) {
    
    		std::cout << "Particle:\n" << particle_list.front( ) << "\n" << std::endl;
    		particle_list.pop_front( );
    	}
    }
    

    greetz, Swordfish


Anmelden zum Antworten