warum stürzt das ab(push_back bei vector)



  • genau , und diese vector muss du über den kopy Konstruktor kopieren (Tiefe kopie)?

    Ich frage mich allerding wie sieht der Automatisch Kopierte Kopy C-Tor von "hud" aus?

    Wenn er so aussieht, müssten die objekt ohne weiterere automatisch kopiert werden ??

    Hud::Hud(const Hud & oScr){
    
     this->Kinder = oScr.Kinder;
    
    }
    


  • Wenn Hud wirklich nichts weiter enthält, braucht es keinen besonderen Copy-CTor, weil der automatisch generierte das Richtige tut.



  • GreyHound schrieb:

    wäre dies ein solcher Fall für nen eigenen CCtor? Oder liegt hier das Problem eher darin das sich dieKatze in den Schwanz beisst

    In dem Fall kommst du mit dem impliziten CTor völlig aus (der vector<> enthält zwar dynamische Daten, aber das ist sein Problem).



  • aha, dann sieht der Autmoatisch genierierte quaise immer so aus:

    Klasse::Klasse(const Klasse &oQuelle){
    
    this->V_1= oQuelle.V_1;
    this->V_2= oQuelle.V_2;
    this->V_3= oQuelle.V_3;
    .
    .
    .
    .
    this->V_N= oQuelle.V_N;
    

    }



  • BorisDieKlinge schrieb:

    aha, dann sieht der Autmoatisch genierierte quaise immer so aus:

    Klasse::Klasse(const Klasse &oQuelle){
    
    this->V_1= oQuelle.V_1;
    this->V_2= oQuelle.V_2;
    this->V_3= oQuelle.V_3;
    .
    .
    .
    .
    this->V_N= oQuelle.V_N;
    

    }

    hm wie würde denn der copy ctor hierfür aussehen?

    class Particle
    {
    public:
    	//contructor
    	Particle( SDL_Surface *img, Vektor *grav, Uint32 bgColor, int lifeTime = 0, double xpos = 0, double ypos = 0, double xvel = 0, double yvel = 0);
    
    	const Particle& operator=(const Particle &right);
    	void addFadeStruct(fadeStruct fs);
    	void move(SDL_Surface *surf);
    	SDL_Surface* getSprite();
    	//dtor
    	virtual ~Particle();
    
    	//x,y, gravity, alive vals usw.
    	Vektor position;
    	Vektor velocity;
    	Vektor *gravity;
    	bool alive;
    	Uint32 bgColor;
    private:
    	SDL_Surface *sprite;
    	int spawntime;
    	int lifetime;
    	Uint32 replaceColor;
    	bool hasFadeStruct;
    	fadeStruct fade;
    	Uint32 *sprPixels;
    
    };
    

    kann ich praktisch den operator= kopieren und den funktionskopf anpassen ?



  • @Boris: Praktisch ja - technisch läuft das eher auf Initialisierungslisten hinaus:

    Klasse::Klasse(const Klasse& src)
    : Basis(src)
    , V_1(src.V_1)
    ,
    ...
    , V_N(src.V_N)
    {}
    

    @pixartist: op= hat etwas andere Anforderungen als der CCtor (unter anderem braucht letzterer keinen Test auf Selbstzuweisung und muß die alten Objektdaten nicht freigeben).



  • CStoll schrieb:

    @Boris: Praktisch ja - technisch läuft das eher auf Initialisierungslisten hinaus:

    Klasse::Klasse(const Klasse& src)
    : Basis(src)
    , V_1(src.V_1)
    ,
    ...
    , V_N(src.V_N)
    {}
    

    @pixartist: op= hat etwas andere Anforderungen als der CCtor (unter anderem braucht letzterer keinen Test auf Selbstzuweisung und muß die alten Objektdaten nicht freigeben).

    hmm, wieso kann ich eigentlich beim operator= auf private's vom parameter zugreifen ? (und geht das auch beim copy ctor? )

    was sind die anderen "anderen anforderungen" ?



  • class Particle 
    { 
    public: 
        //contructor 
        Particle( SDL_Surface *img, Vektor *grav, Uint32 bgColor, int lifeTime = 0, double xpos = 0, double ypos = 0, double xvel = 0, double yvel = 0); 
    
        const Particle& operator=(const Particle &right); 
        void addFadeStruct(fadeStruct fs); 
        void move(SDL_Surface *surf); 
        SDL_Surface* getSprite(); 
        //dtor 
        virtual ~Particle(); 
    
        //x,y, gravity, alive vals usw. 
        Vektor position; //<-- Tiefe Kopie
        Vektor velocity; //<-- Tiefe Kopie
        Vektor *gravity;  // <-- inhalt des Pointers für das neue Objekt mit new anlegen
    
        bool alive; //<-- einfach zuweisung
        Uint32 bgColor; //<-- einfach zuweisung
    private: 
        SDL_Surface *sprite; // <-- inhalt des Pointers für das neue Objekt mit new anlegen
    
        int spawntime; //<-- einfach zuweisung
        int lifetime; //<-- einfach zuweisung
        Uint32 replaceColor; //<-- einfach zuweisung
        bool hasFadeStruct;   //<-- einfach zuweisung
        fadeStruct fade; //<-- einfach zuweisung (jenachdem was da drin ist)
        Uint32 *sprPixels; // <-- inhalt des Pointers für das neue Objekt mit new anlegen
    
    };
    

    bei einem Poibnter komm es drauf an ob du für jede Instanz ein Objekt anlegen muss und dese npointer speicherst, oder ob du über den pointer ein externe Objekt referenzierst!



  • Erstens: private gilt auf Klassenebene, nicht auf Objektebene.

    Zweitens: Der Copy-Ctor erzeugt eine Kopie aus dem Nichts, der op= ersetzt ein bestehendes Objekt - das sind schon ganz andere Arbeitsbedingungen. Das bedeutet auch, daß der Copy-Ctor keine Tests auf Selbstzuweisung durchführen muß (this ist immer ein jungfräuliches Objekt) und auch keine Alt-Daten entsorgen muß.



  • Ich werde es wohl ausprobieren müssen. 😛
    Ausserdem ist der Grundansatz wohl eher ungeignet da sich auf die Art den Juds nur Kinder zugewiesen können bevor sie selbst in ein übergeordneten Hud gesteckt werden.



  • ähh was soll denn das jetzt ?

    __thiscall Particle::Particle(class Particle const &)" (??0Particle@@QAE@ABV0@@Z) bereits in Particle.obj definiert



  • Hast du vielleicht versucht, den Copy-Ctor direkt im Header zu definieren?



  • CStoll schrieb:

    Hast du vielleicht versucht, den Copy-Ctor direkt im Header zu definieren?

    nö:

    class Particle
    {
    public:
    	//contructor
    	Particle( SDL_Surface *img, Vektor *grav, Uint32 bgColor, int lifeTime = 0, double xpos = 0, double ypos = 0, double xvel = 0, double yvel = 0);
    	//copy ctor
    	Particle(const Particle &right);
    
    	const Particle& operator=(const Particle &right);
    	void addFadeStruct(fadeStruct fs);
    	void move(SDL_Surface *surf);
    	//dtor
    	virtual ~Particle();
    
    	//x,y, gravity, alive vals
    	Vektor position;
    	Vektor velocity;
    	Vektor *gravity;
    	bool alive;
    	Uint32 bgColor;
    private:
    	SDL_Surface *sprite;
    	int spawntime;
    	int lifetime;
    	Uint32 replaceColor;
    	bool hasFadeStruct;
    	fadeStruct fade;
    	Uint32 *sprPixels;
    
    };
    


  • Und wo stehen die dazugehörigen Methodendefinitionen? (btw, bei welcher Datei beschwert sich eigentlich der Linker?)



  • CStoll schrieb:

    Und wo stehen die dazugehörigen Methodendefinitionen? (btw, bei welcher Datei beschwert sich eigentlich der Linker?)

    in der Particle.ccp 😉

    #include "Particle.h"
    
    //contructor
    Particle::Particle(SDL_Surface *img, Vektor *grav, Uint32 bgColor, int lifeTime, double xpos, double ypos, double xvel, double yvel)
    {
    	gravity = grav;
    	sprite = img;
    	position.x = xpos;
    	position.y = ypos;
    	velocity.x = xvel;
    	velocity.y = yvel;
    	alive = true;
    	spawntime = SDL_GetTicks();
    	lifetime = lifeTime;
    	replaceColor = bgColor;
    	hasFadeStruct = false;
    	sprPixels = (Uint32 *)sprite->pixels;
    }
    Particle::Particle(const Particle &p)
    {
    	gravity = p.gravity;
    	sprite = p.sprite;
    	sprite->refcount++;
    
    	position = p.position;
    	velocity = p.velocity;
    	alive = true;
    	spawntime = SDL_GetTicks();
    	lifetime = p.lifetime;
    	replaceColor = p.replaceColor;
    	hasFadeStruct = p.hasFadeStruct;
    	sprPixels = (Uint32 *)sprite->pixels;
    	if(hasFadeStruct)
    		fade = p.fade;
    }
    
    const Particle& Particle::operator=(const Particle &right)
    {
    	if(this != &right)
    	{
    		gravity = right.gravity;
    		gravity = right.gravity;
    		sprite = right.sprite;
    		sprite->refcount++;
    		position = right.position;
    		velocity = right.velocity;
    		alive = true;
    		spawntime = SDL_GetTicks();
    		lifetime = right.lifetime;
    		replaceColor = right.replaceColor;
    		hasFadeStruct = right.hasFadeStruct;
    		sprPixels = (Uint32 *)sprite->pixels;
    		fade = right.fade;
    	}
    	return *this;
    }
    ....
    


  • pixartist schrieb:

    CStoll schrieb:

    Und wo stehen die dazugehörigen Methodendefinitionen? (btw, bei welcher Datei beschwert sich eigentlich der Linker?)

    in der Particle.ccp 😉

    Und bei welcher Datei beschwert sich der Linker?

    Bindest du irgendwelche .cpp-Dateien mittels Includedirektive in andere ein?



  • MFK schrieb:

    pixartist schrieb:

    CStoll schrieb:

    Und wo stehen die dazugehörigen Methodendefinitionen? (btw, bei welcher Datei beschwert sich eigentlich der Linker?)

    in der Particle.ccp 😉

    Und bei welcher Datei beschwert sich der Linker?

    Bindest du irgendwelche .cpp-Dateien mittels Includedirektive in andere ein?

    achso ja:

    PSpawner.obj : error LNK2005: "public: __thiscall Particle::P...
    


  • Und wie kommt die Definition des Particle-Copykonstruktors in PSpawner.cpp?



  • MFK schrieb:

    Und wie kommt die Definition des Particle-Copykonstruktors in PSpawner.cpp?

    hmm

    Particle pt(t, gravity, replaceColor, lifetime, pos.x, pos.y, direction.x, direction.y);
    

    hatte es verursacht...
    jetzt gehts 🙂



  • WOW wusstet ihr, dass die vector klasse die enthaltenen objekte nicht nur im ram rumschiebt, sonder auch ständig kopiert und dabei den copy ctor aufruft? ich hab die spawntime des partikels im copy ctor immer auf getticks() gesetzt, und mich gewundert, warum die partikel im flug ständig "resetted" werden...da muss man erstmal drauf kommen....


Anmelden zum Antworten